/***********************************************/
/*★ プロキシのサンプルプログラム 前田 稔 ★*/
/***********************************************/
namespace Handler
{
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Proxies;
// 割り込みで実行されるメソッド(real proxy)
public class Sample : MarshalByRefObject
{
public void Func()
{
Console.WriteLine("Func() が実行されました");
}
}
// 透過プロキシ(transparent proxy)
public class SampleProxy : RealProxy
{
private Sample sample;
// 透過プロキシを返すファクトリメソッド
static public Sample CreateSample()
{
Sample smpl = new Sample();
SampleProxy proxy = new SampleProxy(smpl, typeof(Sample));
return (Sample) proxy.GetTransparentProxy();
}
// base(type) で RealProxy のコンストラクタを呼び出す
public SampleProxy( Sample smpl, Type type) : base(type)
{
sample = smpl;
}
// Invoke() をオーバライドして Method を呼び出す
public override IMessage Invoke(IMessage imsg)
{
IMethodCallMessage call = (IMethodCallMessage) imsg;
Console.WriteLine(call.MethodName + "を呼び出します");
IMethodReturnMessage res = RemotingServices.ExecuteMessage(sample, call);
return res;
}
}
// 割り込みハンドラを起動する
class SampleMain
{
[STAThread]
static void Main(string[] args)
{
// 透過プロキシを生成する
Sample sample = SampleProxy.CreateSample();
// 透過プロキシから Func() を呼び出す
sample.Func( );
Console.ReadLine();
}
}
}
|