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 する必要はこの時点ではまったく無い。