Создание экземпляра прокси-класса (RealProxy)
Я пытаюсь создать прокси с использованием расширения RealProxy. У меня не было проблем с переадресацией звонков и их перехватом. Однако я также хотел перехватить создание экземпляра проксируемого класса, поэтому попытался переопределить создание экземпляра в производном классе ProxyAttribute.
Вот код:
namespace T1
{
[ProxiableProxy]
class Proxiable : ContextBoundObject
{
public void DoStuff(string test)
{
return;
}
}
class ProxiableProxyAttribute : ProxyAttribute
{
public override MarshalByRefObject CreateInstance(Type serverType)
{
return (Proxiable)new MyProxy(serverType).GetTransparentProxy();
}
public override RealProxy CreateProxy(ObjRef objRef, Type serverType, object serverObject, System.Runtime.Remoting.Contexts.Context serverContext)
{
return new MyProxy(serverType);
}
}
class MyProxy : RealProxy
{
public MyProxy(Type myType) : base(myType)
{
}
public override System.Runtime.Remoting.Messaging.IMessage Invoke(IMessage myIMessage)
{
Console.WriteLine("MyProxy.Invoke Start");
Console.WriteLine("");
ReturnMessage myReturnMessage = null;
if (myIMessage is IMethodCallMessage)
{
Console.WriteLine("MethodCall");
}
else if (myIMessage is IMethodReturnMessage)
Console.WriteLine("MethodReturnMessage");
if (myIMessage is IConstructionCallMessage)
{
return new ConstructionResponse(new Header[1] { new Header("__Return", this.CreateObjRef(typeof(object))) }, (IConstructionCallMessage)myIMessage);
}
myReturnMessage = new ReturnMessage(5,null,0,null,
(IMethodCallMessage)myIMessage);
Console.WriteLine("MyProxy.Invoke - Finish");
return myReturnMessage;
}
public override ObjRef CreateObjRef(Type requestedType)
{
return new MyObjRef();
}
}
class MyObjRef : ObjRef
{
public override object GetRealObject(System.Runtime.Serialization.StreamingContext context)
{
return base.GetRealObject(context);
}
}
}
Я взял информацию отсюда: http://msdn.microsoft.com/en-us/library/vstudio/scx1w94y(v=vs.100).aspx
Этот код должен работать, когда я создаю экземпляр класса Proxiable:
новый Proxiable() -или- Activator.CreateInstance(typeof(Proxiable))
Когда я создаю экземпляр класса, код ДЕЛАЕТ исключение - CreateInstance в ProxiableProxyAttribute и метод Invoke в MyProxy-. Но в методе Invoke MyProxy я также должен эмулировать конструктор, и он должен возвращать объект ObjRef. Я пытался вернуть эту ссылку, но получаю исключение "Недопустимый ObjRef, предоставленный Unmarshal".
Я действительно понятия не имею, это исключение очень абстрактно, и в Интернете практически нет информации об этом. Если кто-нибудь знает, какой экземпляр ObjRef ожидает маршаллер, это действительно помогло бы мне.
1 ответ
Это похоже на работу:
if (myIMessage is IConstructionCallMessage)
{
IConstructionReturnMessage retMsg = InitializeServerObject((IConstructionCallMessage)myIMessage);
MarshalByRefObject ret = GetUnwrappedServer();
SetStubData(this, ret);
return retMsg;
}
Из блогов MSDN.