TransparentProxy と RealProxy
実際、GetTransparentPropxy() によって得られるのは 引数として渡した Form1 のインスタンスではなく、.NET Remoting のコアとなる TransparentProxy と言うオブジェクトである。
この TrapsparentProxy を生成するには、通常は RemotingServices クラスなんかで操作するものだが、直接生成することをサポートする System.Runtime.Remoting.Proxies.RealProxy クラスを利用することで、簡単に得ることができる。
このクラスは抽象クラスなので、派生クラスを作成することで実体化を行う。
public class Form1Proxy : RealProxy { public Form1Proxy() : base( typeof(Form1) ) { } public override IMessage Invoke(IMessage msg) { // TODO: Invoke() を実装する } }
これは、Form1 の TransparentProxy を得るための実装 Form1Proxy の最初の第一歩である。
RealProxy クラスには GetTransparentProxy() が定義されていて、このメソッドはコンストラクタに渡したクラスの TransparentProxy を作ってくれる。
このクラスを利用することで、
Form1 form1 = new Form1Proxy().GetTransparentProxy() as Form1;
という呼び出しが可能になる。
最初の例にあった MethodLogger は Form1 そのものを生成しているが、TransparentProxy を生成するために必要なものは Form1 クラスであって、Form1 のインスタンスではないため、Form1 を new する必要はこの時点ではまったく無い。