Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NETCore中是否有System.Runtime.InteropServices.Marshal.GetActiveObject()的替代项?_.net_Com - Fatal编程技术网

.NETCore中是否有System.Runtime.InteropServices.Marshal.GetActiveObject()的替代项?

.NETCore中是否有System.Runtime.InteropServices.Marshal.GetActiveObject()的替代项?,.net,com,.net,Com,方法GetActiveObject()在.NET Framework中的System.Runtime.InteropServices.Marshal中可用,但在.NET Core()中不可用 如果我想使用.NET Core(来自PowerShell 7),有什么办法吗?特定的API已经消失,但您可以轻松地p/调用以获取该信息。这里有一个在Windows(和.NET framework)上适用于.NET Core 3.1+的等效实现: 公共静态对象GetActiveObject(字符串progId

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


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

特定的API已经消失,但您可以轻松地p/调用以获取该信息。

这里有一个在Windows(和.NET framework)上适用于.NET Core 3.1+的等效实现:

公共静态对象GetActiveObject(字符串progId,bool throwOnError=false) { if(progId==null) 抛出新ArgumentNullException(nameof(progId)); var hr=CLSIDFromProgIDEx(progId,out var clsid); 如果(hr<0) { 如果(错误) 元帅。通过hr(hr)的例外情况; 返回null; } hr=GetActiveObject(clsid、IntPtr.Zero、out var obj); 如果(hr<0) { 如果(错误) 元帅。通过hr(hr)的例外情况; 返回null; } 返回obj; } [DllImport(“ole32”)] 私有静态外部int-CLSIDFromProgIDEx([marshallas(UnmanagedType.LPWStr)]字符串lpszProgID,out-Guid-lpclsid); [DllImport(“oleaut32”)] 私有静态extern int GetActiveObject([Marshallas(UnmanagedType.LPStruct)]Guid rclsid,IntPtr pvReserved,[Marshallas(UnmanagedType.IUnknown)]out object ppunk;
我不是Powershell专家,但我认为您可以将其移植到Powershell,或者直接在Powershell中使用一些C

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);