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

时间:2012-01-27 16:20:03

标签: powershell com com-interop powershell-v2.0 imapi

如我的问题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脚本的一部分),它将成为{{1}类型的.NET对象}}。那可能吗?如果没有,我有什么替代方案?

2 个答案:

答案 0 :(得分:6)

您可以尝试在[{1}}类型的(不安全的)c#方法中传递$is,并尝试使用声明为object VAR来处理它>

System.Runtime.InteropServices.ComTypes.IStream

在add-type之后的powershell中:

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(...)
    }
}

答案 1 :(得分:3)

你无法做到这一点。 PowerShell使用透明的“com适配器”层来阻止它工作,但在脚本中启用后期绑定。对于大多数情况来说这是一件好事,但不是你的。