.NET Core中是否有System.Runtime.InteropServices.Marshal.GetActiv



方法GetActiveObject()在.NET Framework的System.Runtime.InteropServices.Marshal中可用,但在.NET Core中不可用(https://stackoverflow.com/a/58010881/180275)。

如果我想使用.NET Core(来自PowerShell 7(,有办法吗?

这里有一个适用于Windows(和.NET框架(上.NET核心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#。

特定的API已经不复存在,但您可以轻松地p/InvokeGetActiveObject来获取这些信息。

相关内容

最新更新