/// <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); }
/// <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; }