PowerShell: как преобразовать COM-объект в тип взаимодействия .NET? - PullRequest
5 голосов
/ 27 января 2012

Как описано в моем вопросе Создание 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 #code?

Обновление: Очевидно, что это преобразование не может быть выполнено, как говорит ответ x0n.

Теперь моя цель - передать этот IStream COM-объектнекоторый код C # (часть того же скрипта PowerShell, использующего Add-Type), где он станет объектом .NET типа System.Runtime.InteropServices.ComTypes.IStream.Это возможно?Если нет, какие у меня есть альтернативы?

Ответы [ 2 ]

6 голосов
/ 21 марта 2012

Вы можете попытаться передать $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)
3 голосов
/ 27 января 2012

Вы не можете сделать эту работу. PowerShell использует прозрачный слой «com-адаптера», который предотвращает это, но разрешает позднее связывание в скрипте Для большинства случаев это хорошая вещь, но не в вашем.

...