/// <summary>
        /// 用于调用方法的反射方法。有关realproxy,请参阅文档。
        /// </summary>
        /// <param name="message"></param>
        /// <returns></returns>
        public override System.Runtime.Remoting.Messaging.IMessage Invoke(System.Runtime.Remoting.Messaging.IMessage message)
        {
            // 转换为 MethodCallMessage
            System.Runtime.Remoting.Messaging.IMethodCallMessage methodMessage = new System.Runtime.Remoting.Messaging.MethodCallMessageWrapper((System.Runtime.Remoting.Messaging.IMethodCallMessage)message);

            // 提取正在调用的方法
            System.Reflection.MethodBase method = methodMessage.MethodBase;

            // 执行 call
            object returnValue = null;

            if (method.DeclaringType == typeof(IDynamicProxy))
            {
                // 处理此实例而不是代理目标实例上的IDynamicProxy接口调用
                returnValue = method.Invoke(this, methodMessage.Args);
            }
            else
            {
                // 委托给调用处理程序
                returnValue = invocationHandler(proxyTarget, method, methodMessage.Args);
            }

            // 创建返回消息 (ReturnMessage)
            System.Runtime.Remoting.Messaging.ReturnMessage returnMessage = new System.Runtime.Remoting.Messaging.ReturnMessage(returnValue, methodMessage.Args, methodMessage.ArgCount, methodMessage.LogicalCallContext, methodMessage);
            return(returnMessage);
        }
Esempio n. 2
0
        /// <summary>
        /// The reflective method for invoking methods. See documentation for RealProxy.
        /// </summary>
        /// <param name="message"></param>
        /// <returns></returns>
        public override System.Runtime.Remoting.Messaging.IMessage Invoke(System.Runtime.Remoting.Messaging.IMessage message)
        {
            // Convert to a MethodCallMessage
            System.Runtime.Remoting.Messaging.IMethodCallMessage methodMessage = new System.Runtime.Remoting.Messaging.MethodCallMessageWrapper((System.Runtime.Remoting.Messaging.IMethodCallMessage)message);

            // Extract the method being called
            System.Reflection.MethodBase method = methodMessage.MethodBase;

            // Perform the call
            object returnValue = null;

            if (method.DeclaringType == typeof(IDynamicProxy))
            {
                // Handle IDynamicProxy interface calls on this instance instead of on the proxy target instance
                returnValue = method.Invoke(this, methodMessage.Args);
            }
            else
            {
                // Delegate to the invocation handler
                returnValue = invocationHandler(proxyTarget, method, methodMessage.Args);
            }

            // Create the return message (ReturnMessage)
            System.Runtime.Remoting.Messaging.ReturnMessage returnMessage = new System.Runtime.Remoting.Messaging.ReturnMessage(returnValue, methodMessage.Args, methodMessage.ArgCount, methodMessage.LogicalCallContext, methodMessage);
            return(returnMessage);
        }
        public override System.Runtime.Remoting.Messaging.IMessage Invoke(System.Runtime.Remoting.Messaging.IMessage message)
        {
            // Convert to a MethodCallMessage
            System.Runtime.Remoting.Messaging.IMethodCallMessage methodMessage = new System.Runtime.Remoting.Messaging.MethodCallMessageWrapper((System.Runtime.Remoting.Messaging.IMethodCallMessage)message);

            // Extract the method being called
            System.Reflection.MethodBase method = methodMessage.MethodBase;

            // Perform the call
            object returnValue = null;
            if (method.DeclaringType == typeof(IDynamicProxy)) {
                // Handle IDynamicProxy interface calls on this instance instead of on the proxy target instance
                returnValue = method.Invoke(this, methodMessage.Args);
            } else {
                // Delegate to the invocation handler
                returnValue = invocationHandler(proxyTarget, method, methodMessage.Args);
            }

            // Create the return message (ReturnMessage)
            System.Runtime.Remoting.Messaging.ReturnMessage returnMessage = new System.Runtime.Remoting.Messaging.ReturnMessage(returnValue, methodMessage.Args, methodMessage.ArgCount, methodMessage.LogicalCallContext, methodMessage);
            return returnMessage;
        }