Оболочки COM-интерфейса в PowerShell? - PullRequest
4 голосов
/ 28 октября 2009

У меня есть следующий код в C #, который я пытаюсь перенести в PowerShell. Но я не знаю, как портировать этот акт:

((_ISkypeEvents_Event)skype).CallStatus += CallStatusHandler;

Если я просто наберу [Skype4COM.ISkypeEvents_Event] в моей консоли PowerShell, я получу:

Невозможно найти тип [Skype4COM.ISkypeEvents_Event]: убедитесь, что загружена сборка, содержащая этот тип.

Однако я могу получить всех членов объекта $ skype:

$skype = New-Object -ComObject Skype4COM.Skype

Следующая строка не работает:

$skypeevent = [Skype4COM._ISkypeEvents_Event]$skype

Если я попытаюсь вызвать метод непосредственно для объекта $ skype, например:

$skype.add_CallStatus({ write-host "yay" })

... это (как и ожидалось) говорит мне, что:

Ошибка вызова метода, поскольку [System .__ ComObject # {b1878bfe-53d3-402e-8c86-190b19af70d5}]] не содержит метод с именем 'add_CallStatus'.

Я пытался создать оболочку COM, но по-прежнему не удается получить тип для интерфейса COM ...

Есть идеи? Большое спасибо!

1 Ответ

5 голосов
/ 29 октября 2009

Особые случаи PowerShell COM-объекты со своим собственным «COM-адаптером» с поздним связыванием для предоставления участникам вызовов (и командлета Get-Member ). К сожалению, иногда происходит сбой, если не удается найти связанную библиотеку типов , что обычно происходит, когда на самом деле экземпляр является удаленным COM-объектом, обнаруженным через тип transparentproxy.

Другим побочным эффектом этой адаптации COM является то, что вы косвенно лишены возможности использовать этот тип приведения для получения доступа к членам. PowerShell обычно предоставляет класс CoClass сборки взаимодействия (динамически создаваемый или PIA), который включает в себя элементы всех интерфейсов. На самом деле это ограничение интерфейсов касается не только COM-объектов: «.NET Adapter» в PowerShell также не работает с простыми старыми .NET-интерфейсами. Если честно, это предпочтительное поведение в 99% случаев. PowerShell - это динамический язык, который всегда отображает истинный тип ссылки во время выполнения. Любые попытки привести к интерфейсу будут игнорироваться.

Это приводит к большему количеству проблем, когда вы переходите к явно реализованным интерфейсам в C #. PowerShell их вообще не видит! Я вел блог о технике для прокси-членов явного интерфейса с помощью модуля v2.0. Вы можете попробовать это с интерфейсом COM, но я не уверен, что это сработает.

...