いくつかのクラスを含むマネージ アセンブリがあり、それらのクラスにはオーバーロードされたメソッドがあります。アセンブリを COM/IDispatch 呼び出し元に公開します
[ComVisible(true)]
..また、アセンブリ自体に適切な Guid を設定します。COM 相互運用のための明示的なインターフェイスは定義しません。すべて動的に行われます。regasm.exe /codebase
マネージ DLL で実行すると、COM 相互運用に登録されます。
OleView を実行すると、アセンブリ内のさまざまなクラスの ProgId を確認できます。しかし、これらの ProgId を参照し、IDispatch ノードを展開すると、これらのクラスの TypeLib 情報がありません。
それでも、スクリプトから、引数を 0 個受け取るメソッドまたは 1 個の引数を受け取るメソッドを呼び出すことができます。複数の引数を受け入れるオーバーロードもある場合、そのメソッドを名前で呼び出すことはできません。私が一貫して得るエラーは
Microsoft VBScript runtime error: Wrong number of arguments or invalid property assignment: <methodname>
このことから、COM/IDispatch クライアントは、COM 相互運用機能を介して公開されたオブジェクトのオーバーロードされたメソッドを適切に解決できないことがわかりました。
それから私は追加しました
[ClassInterface(ClassInterfaceType.AutoDual)]
...問題の各クラスに。DLL の実行後regasm.exe
、IDispatch ノードの下に各メソッドの typelib 情報が表示されます。
私が見つけたのは、オーバーロードされたメソッドは、追加されたサフィックスを含む名前を自動的に取得するということです。MethodX は、自動生成された typelib アセンブリのオーバーロードを MethodX、MethodX_2、MethodX_3 などとして公開します。
そして、これらの接尾辞を使用してメソッド名を参照することで、オーバーロードされたメソッドを呼び出すことができることがわかりました。ただし、一般的な名前ではありません。
さらに興味深いことに、[ClassInterface(ClassInterfaceType.AutoDual)]
クラスからを削除した場合でも、オーバーロードされたメソッドをこの方法で呼び出すことができ、 Wrong number of arguments or invalid property assignment
エラーを回避できました。
私の質問は: この動作 - メンバー名に数字の接尾辞を追加する - は安定していますか? 文書化されていますか?信頼できる?