首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实例化代理类(RealProxy)

实例化代理类(RealProxy)
EN

Stack Overflow用户
提问于 2013-08-02 11:44:01
回答 1查看 1.8K关注 0票数 2

我正在尝试使用RealProxy扩展创建一个代理。我在转接和拦截呼叫方面没有任何问题。然而,我也想拦截被代理的类的实例化,所以我尝试覆盖ProxyAttribute派生类中的实例创建。

代码如下:

代码语言:javascript
复制
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实例,那将会对我有很大帮助。

EN

回答 1

Stack Overflow用户

发布于 2015-03-08 05:34:04

这似乎起作用了:

代码语言:javascript
复制
 if (myIMessage is IConstructionCallMessage)
 {
    IConstructionReturnMessage retMsg = InitializeServerObject((IConstructionCallMessage)myIMessage);
    MarshalByRefObject ret = GetUnwrappedServer();
    SetStubData(this, ret);
    return retMsg;
 }

来自MSDN Blogs

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18008425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档