2009-10-28 42 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接口上嘗試它,但我不確定它會起作用。