4

PowerShellに移植しようとしているC#のコードは次のとおりです。しかし、このキャストを移植する方法がわかりません。

((_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インターフェイスのタイプを取得できません...

何か案は?本当にありがとう!

4

1 に答える 1

5

PowerShell は、メンバーを呼び出し元 (およびGet-Memberコマンドレット)に公開するために、独自の遅延バインディング "COM アダプター" を使用して特別なケースの COM オブジェクトを作成します。残念ながら、関連付けられたタイプ ライブラリが見つからない場合、これは失敗することがあります。これは通常、インスタンスが実際には透過プロキシ タイプを介して表示されるリモート COM オブジェクトである場合に発生します。

この COM 適応のもう 1 つの副作用は、これらの種類のキャストを使用してメンバーにアクセスすることが間接的に妨げられることです。通常、PowerShell は相互運用アセンブリの (動的に作成された、または PIA) CoClass クラスを公開します。これには、すべてのインターフェイスのメンバーが含まれます。実際、インターフェイスに関するこの制限は、COM オブジェクトだけのものではありません。PowerShell の「.NET アダプター」は、単純な古い .NET インターフェイスも処理しません。正直なところ、これは 99% のケースで推奨される動作です。PowerShell は動的言語であり、実行時に参照の真の型を常に公開します。インターフェイスにキャストしようとしても無視されます。

これにより、C# で明示的に実装されたインターフェイスに到達すると、さらに多くの問題が発生します。PowerShell はそれらをまったく見ることができません! v2.0 モジュールを使用して明示的なインターフェイス メンバーをプロキシする手法についてブログを書きました。COM インターフェイスに対して試すこともできますが、うまくいくかどうかはわかりません。

于 2009-10-28T21:35:38.453 に答える