PowerShell:如何将COM对象转换为.NET互操作类型?

正如我在问题Create ISO image using PowerShell: how to save IStream to file?中所述,在PowerShell中我创建了一个IStream对象,如下所示:

$is = (New-Object -ComObject IMAPI2FS.MsftFileSystemImage).CreateResultImage().ImageStream

此对象是(PowerShell)类型System .__ ComObject.不知怎的,PowerShell知道它是一个IStream:

PS C:\> $is -is [System.Runtime.InteropServices.ComTypes.IConnectionPoint]
False
PS C:\> $is -is [System.Runtime.InteropServices.ComTypes.IStream]
True

但是,此类型的强制转换失败:

PS C:\> [System.Runtime.InteropServices.ComTypes.IStream] $is
Cannot convert the "System.__ComObject" value of type "System.__ComObject" to type "System.Runtime.InteropServices.ComT
ypes.IStream".
At line:1 char:54
+ [System.Runtime.InteropServices.ComTypes.IStream] $is <<<<
    + CategoryInfo          : NotSpecified: (:) [], RuntimeException
    + FullyQualifiedErrorId : RuntimeException

如何在不使用C#代码的情况下进行此转换?

更新:显然这种转换无法正常工作,正如x0n的回答所说.

现在,我的目标是将此IStream COM对象传递给某些C#代码(使用Add-Type的同一PowerShell脚本的一部分),它将成为System.Runtime.InteropServices.ComTypes.IStream类型的.NET对象.那可能吗?如果没有,我有什么替代品?

您可以尝试在(不安全的)c#方法中传递$is,如objecttype,并尝试使用VARdeclared作为System.Runtime.InteropServices.ComTypes.IStream处理它

public unsafe static class MyClass
{
    public static void MyMethod(object Stream) 
    {
       var i = Stream as System.Runtime.InteropServices.ComTypes.IStream; 

    //do something with i like i.read(...) and i.write(...)
    }
}

在添加类型后的powershell中:

[MyClass]::MyMethod($is)
https://stackoverflow.com/questions/9036551/powershell-how-to-convert-a-com-object-to-an-net-interop-type

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:PowerShell:如何将COM对象转换为.NET互操作类型?