プログラミングメモ: .net CF でDelegate.DynamicInvokeもどき

DynamicInvokeを使うと以下のような呼び出し方(遅延バインディング)ができるので使い方によっては便利です。(以下の例はC#)

Delegate method = new FooDelegate(Bar); //Foo、Barは例
method.DynamicInvoke(a, b, c); //a、b、cは例

これを使うとイベントの発生を集中管理するためのプロキシ的な関数を作ることもできます。

しかしながら、Compact Frameworkでは、Type.InvokeMethod()やControl.Invoke()はサポートされている割に、意外にもDelegate.DynamicInvoke()はサポートされていません。

少なくともW-ZERO3の環境(WM5, CF2.0)ではControl.Invoke()で代用しても例外は発生しないのですが、Windows XPなどPCではコントロールと別スレッドから呼び出ししなければ例外が発生してしまうようです。(もともと用途が違いますから)

単純にPC版.net Frameworkとソースコードを共通化したい場合には、プリプロセッサを使用できますが、一方でCompact Frameworkの実行ファイルをPC上で実行したい場合などは次のようにすることもできます。

Delegate method = new FooDelegate(Bar); //Foo、Barは例
method.GetType().GetMethod(“Invoke”).Invoke(method, a, b, c);

ただし、実際には環境依存な部分もあるのでtry-catchステートメントで想定外の例外を拾ってやる必要があるかもしれません。

ちなみに、Invoke系メソッドの対象のデリゲートがイベントである場合は、中身を調べたりしなくても登録されているイベントハンドラすべてが、ちゃんと呼び出されます。

.Net Compact Framework 2.0 + W-ZERO3[es]で動作を確認しています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です