より汎用的な Invoke() の実装
このような問題を解決するには、リフレクションを利用するというのがすぐに思いつく手段ではあるが、*1 RealProxy クラスや ReturnMessage クラス同様に、IMethodCallMessage を処理する機能が .NET によって最初から用意されている。
private Form1 form1 = new Form1(); public override IMessage Invoke(IMessage msg) { IMethodCallMessage request = msg as IMethodCallMessage; Debug.WriteLine(request.MethodName "が呼び出されました。"); Debug.Indent(); try { return RemotingSerivces.ExecuteMessage(form1, request); } finally { Debug.Unindent(); Debug.WriteLine(request.MethodName "の実行を終了しました。"); } }
非常にシンプルな実装になった。
RemotingServices.ExecuteMessage() は、IMethodCallMessage に格納された情報を元に、第0引数の form1 のメソッドを検索し、適切な引数で実行して IMethodReturnMessage を作成してくれる。
あまりにも簡単かつ便利で怖いぐらいである。
RemotingServices.ExecuteMessage() の第0引数の型は object ではなく MarshalByRefObject である。ここまで敢えて伏せていたのだが、.NET Remoting の仕組みを利用する都合上、対象となるクラスは必ずこのクラスから派生していなければならない。
*1:当初は頑張ってリフレクションを利用していたりもした