我正在尝试使用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() -or- Activator.CreateInstance(类型or(Proxiable))
当我实例化这个类时,代码会执行ProxiableProxyAttribute中的-the CreateInstance和MyProxy-中的Invoke方法。但是在MyProxy的Invoke方法中,我还必须模拟构造函数,并且它必须返回一个ObjRef对象。我一直在尝试返回这个引用,但是得到了一个异常"Invalid ObjRef provided to‘Unmarshal’“。
我现在真的不知道,这个异常是非常抽象的,在互联网上几乎没有关于这个的信息。如果有人知道编组程序期望的是哪种类型的ObjRef实例,那将会对我有很大帮助。
发布于 2015-03-08 05:34:04
这似乎起作用了:
if (myIMessage is IConstructionCallMessage)
{
IConstructionReturnMessage retMsg = InitializeServerObject((IConstructionCallMessage)myIMessage);
MarshalByRefObject ret = GetUnwrappedServer();
SetStubData(this, ret);
return retMsg;
}来自MSDN Blogs。
https://stackoverflow.com/questions/18008425
复制相似问题