【发布时间】:2021-02-25 14:18:43
【问题描述】:
GetActiveObject() 方法在 .NET Framework 中的 System.Runtime.InteropServices.Marshal 中可用,但在 .NET Core (https://stackoverflow.com/a/58010881/180275) 中不可用。
如果我想使用 .NET Core(来自 PowerShell 7),有什么办法吗?
【问题讨论】:
GetActiveObject() 方法在 .NET Framework 中的 System.Runtime.InteropServices.Marshal 中可用,但在 .NET Core (https://stackoverflow.com/a/58010881/180275) 中不可用。
如果我想使用 .NET Core(来自 PowerShell 7),有什么办法吗?
【问题讨论】:
这是适用于 Windows(和 .NET 框架)上 .NET core 3.1+ 的等效实现:
public static object GetActiveObject(string progId, bool throwOnError = false)
{
if (progId == null)
throw new ArgumentNullException(nameof(progId));
var hr = CLSIDFromProgIDEx(progId, out var clsid);
if (hr < 0)
{
if (throwOnError)
Marshal.ThrowExceptionForHR(hr);
return null;
}
hr = GetActiveObject(clsid, IntPtr.Zero, out var obj);
if (hr < 0)
{
if (throwOnError)
Marshal.ThrowExceptionForHR(hr);
return null;
}
return obj;
}
[DllImport("ole32")]
private static extern int CLSIDFromProgIDEx([MarshalAs(UnmanagedType.LPWStr)] string lpszProgID, out Guid lpclsid);
[DllImport("oleaut32")]
private static extern int GetActiveObject([MarshalAs(UnmanagedType.LPStruct)] Guid rclsid, IntPtr pvReserved, [MarshalAs(UnmanagedType.IUnknown)] out object ppunk);
我不是 Powershell 专家,但我认为您可以将其移植到 Powershell 或直接在 Powershell 中使用一点 C#。
【讨论】:
$blah = add-type -MemberDefinition $methodDef -Name "Blah" -Namespace "Blah" -PassThru 更好的事情,然后将其用作$dte = $blah::GetActiveObject('VisualStudio.DTE.16.0') More information on Add-Type here
该特定 API 已消失,但您可以轻松 P/Invoke GetActiveObject 以获取该信息。
【讨论】: