PowerShell: как преобразовать COM-объект в тип взаимодействия.NET?
Как описано в моем вопросе Создание ISO-образа с помощью PowerShell: как сохранить IStream в файл? в 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# (часть того же сценария PowerShell, использующего Add-Type
), где он станет объектом.NET типа System.Runtime.InteropServices.ComTypes.IStream
, Это возможно? Если нет, какие у меня есть альтернативы?
2 ответа
Вы можете попробовать пройти $is
в (небезопасном) методе C#, подобном object
введите и попробуйте справиться с этим VAR
объявлен как 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)
Вы не можете сделать эту работу. PowerShell использует прозрачный слой "com-адаптера", который предотвращает это, но позволяет позднее связывание в сценарии. В большинстве случаев это хорошо, но не в вашем.