複数メソッドを定義

プロキシで複数のメソッドを定義します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. 割り込みで実行されるメソッドのクラス real proxy に複数メソッドを定義してみましょう。
    Proxy の基礎は Proxy の基礎 を参照して下さい。
        /***********************************************/
        /*★ プロキシで複数メソッドを定義    前田 稔 ★*/
        /***********************************************/
        using System;
        using System.Runtime.Remoting.Messaging;
        using System.Runtime.Remoting.Proxies;
        using System.Reflection;
        
  2. real proxy(MyMethod class)で、Print() と Add() を定義します。
    MarshalByRefObject を継承して下さい。
        public class MyMethod : MarshalByRefObject
        {
            public void Print(string s)
            {   Console.WriteLine(s);
            }
            public int Add(int a, int b)
            {   Console.WriteLine("Add() が実行されました");
                return a + b;
            }
        }
        
  3. 透過プロキシ(transparent proxy) です。
    前回と同じ方法では芸が無いので、少しやり方を変えて試してみました。
    コンストラクタで Object と Type を設定しています。
    Invoke() をオーバライドして Method を呼び出します。
        public class MyProxyClass : RealProxy
        {
            private Object  myObject  = null;
            private Type    myType = null;
    
            // コンストラクタから RealProxy のコンストラクタを呼び出す
            public MyProxyClass(Type argType) : base(argType)
            {   myType = argType;
                myObject = Activator.CreateInstance(argType);
            }
    
            // Invoke() をオーバライドして Method を呼び出す
            public override IMessage Invoke(IMessage imsg)
            {   IMethodMessage call = (IMethodMessage)imsg;
                Console.WriteLine(call.MethodName + "を呼び出します");
                Object obj = myType.InvokeMember(call.MethodName,
                             BindingFlags.InvokeMethod, null, myObject, call.Args );
                ReturnMessage res = new ReturnMessage(obj, null, 0,
                             ((IMethodCallMessage)imsg).LogicalCallContext,
                              (IMethodCallMessage)imsg );
                return res;
            }
        }
        
  4. 割り込みハンドラを起動する Main() メソッドです。
    new MyProxyClass() で透過プロキシを生成します。
    sample.Print() で透過プロキシを通じて Print() を呼び出します。
    続いて sample.Add() を呼び出して、実行結果を表示しています。
        class MainClass
        {
            [STAThread]
            static void Main()
            {
                // 透過プロキシを生成する
                MyProxyClass mycls = new MyProxyClass(typeof(MyMethod));
                MyMethod sample = mycls.GetTransparentProxy() as MyMethod;
                // 透過プロキシからメソッドを呼び出す
                sample.Print("あいうえお");
                int val = sample.Add(10,20);
                Console.WriteLine(val.ToString());
                Console.ReadLine();
            }
        }
        

超初心者のプログラム入門(C# Frame Work)