2009-10-28 61 views
4

我在C#中有下面的代码,我尝试移植到PowerShell。 但我不知道如何端口这个转换:PowerShell中的COM接口包装?

((_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" }) 

... it(如预期)告诉我说:

方法调用失败,因为[系统.__ ComObject#{b1878bfe-53d3-402e-8c86-190b19af70d5}]不包含名为 'add_CallStatus' 的方法。

我试图创建一个COM包装,但它仍然无法上获得类型的COM接口...

任何想法?十分感谢!

回答

5

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

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

当您在C#中显式实现接口时,会导致更多问题。 PowerShell根本看不到它们! I did blog about a technique使用v2.0模块代理显式接口成员。你可以在COM接口上尝试它,但我不确定它会起作用。