PowerShell中的COM接口包装器?

时间:2009-10-28 15:26:43

标签: com powershell skype

我在C#中有以下代码,我尝试移植到PowerShell。 但我不知道如何移植这个演员:

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

如果我只是在PowerShell控制台中输入[Skype4COM.ISkypeEvents_Event],我会得到:

  

无法找到类型[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 个答案:

答案 0 :(得分:5)

PowerShell特殊情况COM对象及其自己的后期绑定“COM适配器”,以便将成员公开给调用者(以及Get-Member cmdlet)。不幸的是,如果它找不到关联的type library,有时会失败,这通常发生在实例实际上是通过transparentproxy类型浮出的远程COM对象时。

此COM适应的另一个副作用是间接阻止您使用这些类型的转换来获取成员的访问权限。 PowerShell通常公开interop程序集(动态创建或PIA)CoClass类,其中包括所有接口的成员。实际上,接口上的这种限制不仅仅与COM对象有关:PowerShell中的“.NET适配器”也不处理普通的旧.NET接口。说实话,这是99%的案例的首选行为。 PowerShell是一种动态语言,它将始终在运行时公开引用的真实类型。任何强制转换为接口的尝试都将被忽略。

当您在C#中明确实现接口时,这会导致更多问题。 PowerShell完全看不到它们! I did blog about a technique使用v2.0模块代理显式接口成员。您可以尝试对抗COM接口,但我不确定它是否可行。