Chapter.26

IDispatchEx


1.拡張可能なオブジェクト

JScriptのようなスクリプト言語では、メンバを動的に追加または削除できるオブジェクトを使用することができます。COMの世界ではIDispatchExインターフェースによってこれを可能としています。
マネージドオブジェクトにIDispatchExインターフェースを直接実装することは難しい(と言うかメンドクサイ)ため、.NET Frameworkには、IDispatchExの公開をサポートする機能として、System.Runtime.InteropServices.Expando.IExpandoインターフェースが用意されています。詳しくは以下のリンクを参照してください。
COM インターフェイスのシミュレート (http://msdn2.microsoft.com/ja-jp/library/111chfb8(vs.80).aspx)

IExpandoインターフェースはSystem.Reflection.IReflectインターフェースを継承しており、意外と実装しなければならないメソッドは多くなっています。とりあえず、詳細な解説はMSDNに任せてサンプルを提示します。

VB.NETサンプルソース:chap26.vb.lzh (4KB 2007/12/2)
C#サンプルソース:chap26.cs.lzh (4KB 2007/12/2)


2.IExpandoとJScript

サンプルが対象とするスクリプトはJScriptのみを想定しています。他の言語から使用した場合、正しく動作しない可能性があります。JScriptが使用するIExpandoIReflectのメンバは以下に挙げるものだけでした。スクリプトの書き方によっては使用されるメンバが増えるかもしれませんが・・・。 上の一覧が示すとおり、JScriptで動的な追加と削除が行われるメンバはフィールドだけでした。メソッドを追加した場合、そのメソッド名を持ったフィールドが追加され、そこにCOMオブジェクト(正確にはIDispatchインターフェース)が設定されます。スクリプトから追加したメソッドを呼び出した場合、IReflect.InvokeMemberメソッドを経由してメソッドの呼び出しが指示されます。この時に実際に呼び出さなければならないメソッドとは、渡されたIDispatchインターフェース上のDISPIDが0番のメソッドです。これを実現するためにサンプルでは、JScriptメソッド呼び出し用のIDispatchインターフェースを定義しています。


3.まとめ

IExpandoを実装する必要に迫られサンプルをネットで探し回ったのですが、見つからなかったので実装してみました。今回は独自に定義したインターフェースが少ないので、このサイト的には珍しい章かもしれません。

脱線3回目です。気が向いたら本筋に戻るかもしれません。


前へ 次へ
OLE on .NET Frameworkへ
総合トップへ

サンプルで使用しているキーワード
System.Reflection.IReflect System.Reflection.Emit.AssemblyBuilder System.Reflection.Emit.ModuleBuilder System.Reflection.Emit.TypeBuilder System.Runtime.InteropServices.Expando.IExpando