PowerShell中的COM接口包装器?

PowerShell中的COM接口包装器?,com,powershell,skype,Com,Powershell,Skype,我在C#中有以下代码,我尝试将其移植到PowerShell。 但我不知道如何移植这个演员: ((_ISkypeEvents_Event)skype).CallStatus += CallStatusHandler; 如果我只是在PowerShell控制台中键入[Skype4COM.ISkypeEvents_Event],我会得到: 找不到类型[Skype4COM.ISkypeEvents\u事件]:请确保已加载包含此类型的程序集 但是,我可以获取$skype对象的所有成员: $skype =

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

((_ISkypeEvents_Event)skype).CallStatus += CallStatusHandler;
如果我只是在PowerShell控制台中键入[Skype4COM.ISkypeEvents_Event],我会得到:

找不到类型[Skype4COM.ISkypeEvents\u事件]:请确保已加载包含此类型的程序集

但是,我可以获取$skype对象的所有成员:

$skype = New-Object -ComObject Skype4COM.Skype
以下行不起作用:

$skypeevent = [Skype4COM._ISkypeEvents_Event]$skype
如果我尝试直接在$skype对象上调用该方法,如下所示:

$skype.add_CallStatus({ write-host "yay" })
…它(如预期)告诉我:

方法调用失败,因为[System.u ComObject#{b1878bfe-53d3-402e-8c86-190b19af70d5}]不包含名为“add_CallStatus”的方法

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


有什么想法吗?非常感谢

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

这种COM调整的另一个副作用是,您间接地被阻止使用这种类型的强制转换来访问成员。PowerShell通常公开互操作程序集(动态创建或PIA)的CoClass类,该类包括所有接口的成员。事实上,对接口的这种限制不仅限于COM对象:PowerShell中的“.NET适配器”也不处理普通的旧.NET接口。老实说,这是99%的情况下的首选行为。PowerShell是一种动态语言,在运行时将始终公开引用的真实类型。任何对接口进行强制转换的尝试都将被忽略

当使用C#显式实现接口时,这会导致更多问题。PowerShell根本看不到他们!使用v2.0模块代理显式接口成员。您可以在COM接口上尝试,但我不确定它是否有效