如我的问题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对象}}。那可能吗?如果没有,我有什么替代方案?
答案 0 :(得分:6)
您可以尝试在[{1}}类型的(不安全的)c#方法中传递$is
,并尝试使用声明为object
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适配器”层来阻止它工作,但在脚本中启用后期绑定。对于大多数情况来说这是一件好事,但不是你的。