なぜ new Form1() をしていたのか

すでに予想ができていることとは思うが、前回の方式では Form1 クラスと Form1Proxy クラス双方で、まったく同じロジックとデータを持たなくてはならない。*1
このままでは対象のクラスの中身を完全に理解していないと stub の実装ができないことになってしまうので、各メソッドの実装は本物の Form1 クラスのインスタンスに任せてしまおう。

  private Form1 form1;

  public override IMessage Invoke(IMessage msg)
  {
    IMethodCallMessage request = msg as IMethodCallMessage;

    Debug.WriteLine(request.MethodName + " が呼び出されました.");

    IMethodReturnMessage ret = new ReturnMessage(new NotImplementExcetion(), request);
    switch (request.MethodName)
    {
      case "Add":
        int retval = form1.Add((int) request.Args[0]);
        ret = new ReturnMessage(retval, null, 0, request.LogicalCallContext, request);
        break;

      case "ToString":
        :
    }

    return ret;
  }

こんなかんじだが、これではまだ Form1 のメソッドの一覧が必要になるし、メソッドの引数に応じて呼び出し処理を書かなければならないなど、Form1 の実装を知らなくてもよいが、Form1 の外部インターフェスを完全に知る必要があるという問題がある。

*1:当然、意図的に変更することも可能ではあるが