.NET Core 中是否有 System.Runtime.InteropServices.Marshal.GetActiveObject() 的替代品?

Is there a substitue for System.Runtime.InteropServices.Marshal.GetActiveObject() in .NET Core?

方法 GetActiveObject() 在 .NET Framework System.Runtime.InteropServices.Marshal 中可用,但在 .NET Core () 中不可用。

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

具体的 API 已不存在,但您可以轻松地 P/Invoke GetActiveObject 获取该信息。

这是适用于 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#。