Создание экземпляра прокси-класса (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.

Другие вопросы по тегам