前回の続きというか補足。
RealProxyは、プロキシを被せる相手によっては使えない、という話をした。
ただ、使えないというのは、漏れがあるということで、そう致命的ではない。
今日は致命的な話。というかこれは欠陥じゃないのか。
発生する例外はRemotingException。リファレンスによれば、これは呼び出し元コンテキストが不正な場合に起きるんだとか。
今回のケースでは、これは当てはまらない。
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Proxies;
static class Program
{
[STAThread]
static void Main()
{
OuterClass outer = (OuterClass)new IdiotProxy(new OuterClass()).GetTransparentProxy();
try
{
outer.Inner.Fault(outer);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
class IdiotProxy : RealProxy
{
private readonly MarshalByRefObject _target;
public IdiotProxy(MarshalByRefObject target)
: base(target.GetType())
{
_target = target;
}
public override IMessage Invoke(IMessage msg)
{
return RemotingServices.ExecuteMessage(_target, (IMethodCallMessage)msg);
}
}
class OuterClass : MarshalByRefObject
{
private int _privateField = 0;
private readonly InnerClass _inner = new InnerClass();
public class InnerClass
{
public void Fault(OuterClass outer)
{
outer._privateField = 1;
}
}
public InnerClass Inner
{
get
{
return _inner;
}
}
}