【问题标题】:Is there a substitue for System.Runtime.InteropServices.Marshal.GetActiveObject() in .NET Core?.NET Core 中是否有 System.Runtime.InteropServices.Marshal.GetActiveObject() 的替代品?
【发布时间】: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),有什么办法吗?

【问题讨论】:

    标签: .net com


    【解决方案1】:

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

    【讨论】:

    • 非常感谢。要在 powershell 中实现这一点,您可以使用 Add-Type。将上面的脚本添加到 $methodDef 变量中并做一些比$blah = add-type -MemberDefinition $methodDef -Name "Blah" -Namespace "Blah" -PassThru 更好的事情,然后将其用作$dte = $blah::GetActiveObject('VisualStudio.DTE.16.0') More information on Add-Type here
    【解决方案2】:

    该特定 API 已消失,但您可以轻松 P/Invoke GetActiveObject 以获取该信息。

    【讨论】:

      猜你喜欢
      • 2015-05-02
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      • 2018-11-02
      • 1970-01-01
      • 1970-01-01
      • 2020-10-07
      • 1970-01-01
      相关资源
      最近更新 更多