public virtual IMessage SyncProcessMessage(IMessage msg) { IMessage result = null; try { msg.Properties["__Uri"] = this._realProxy.IdentityObject.URI; if (this._objectMode == WellKnownObjectMode.Singleton) { result = this._realProxy.Invoke(msg); } else { MarshalByRefObject proxy = (MarshalByRefObject)Activator.CreateInstance(this._serverType, true); RealProxy realProxy = RemotingServices.GetRealProxy(proxy); result = realProxy.Invoke(msg); } } catch (Exception e) { result = new ReturnMessage(e, msg as IMethodCallMessage); } return(result); }
internal static IMethodReturnMessage InternalExecuteMessage( MarshalByRefObject target, IMethodCallMessage reqMsg) { ReturnMessage result; Type tt = target.GetType(); MethodBase method; if (reqMsg.MethodBase.DeclaringType == tt || reqMsg.MethodBase == FieldSetterMethod || reqMsg.MethodBase == FieldGetterMethod) { method = reqMsg.MethodBase; } else { method = GetVirtualMethod(tt, reqMsg.MethodBase); if (method == null) { throw new RemotingException( String.Format("Cannot resolve method {0}:{1}", tt, reqMsg.MethodName)); } } if (reqMsg.MethodBase.IsGenericMethod) { Type[] genericArguments = reqMsg.MethodBase.GetGenericArguments(); MethodInfo gmd = ((MethodInfo)method).GetGenericMethodDefinition(); method = gmd.MakeGenericMethod(genericArguments); } var oldContext = CallContext.SetLogicalCallContext(reqMsg.LogicalCallContext); try { object [] out_args; object rval = InternalExecute(method, target, reqMsg.Args, out out_args); // Collect parameters with Out flag from the request message // FIXME: This can be done in the unmanaged side and will be // more efficient ParameterInfo[] parameters = method.GetParameters(); object[] returnArgs = new object [parameters.Length]; int n = 0; int noa = 0; foreach (ParameterInfo par in parameters) { if (par.IsOut && !par.ParameterType.IsByRef) { returnArgs [n++] = reqMsg.GetArg(par.Position); } else if (par.ParameterType.IsByRef) { returnArgs [n++] = out_args [noa++]; } else { returnArgs [n++] = null; } } var latestCallContext = Thread.CurrentThread.GetMutableExecutionContext().LogicalCallContext; result = new ReturnMessage(rval, returnArgs, n, latestCallContext, reqMsg); } catch (Exception e) { result = new ReturnMessage(e, reqMsg); } CallContext.SetLogicalCallContext(oldContext); return(result); }
internal static IMethodReturnMessage InternalExecuteMessage( MarshalByRefObject target, IMethodCallMessage reqMsg) { ReturnMessage result; Type tt = target.GetType(); MethodBase method; if (reqMsg.MethodBase.DeclaringType == tt || reqMsg.MethodBase == FieldSetterMethod || reqMsg.MethodBase == FieldGetterMethod /*|| reqMsg.MethodBase.DeclaringType.IsInterface*/) { method = reqMsg.MethodBase; } else { method = tt.GetMethod(reqMsg.MethodName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, (Type[])reqMsg.MethodSignature, null); } object oldContext = CallContext.SetCurrentCallContext(reqMsg.LogicalCallContext); try { object [] out_args; object rval = InternalExecute(method, target, reqMsg.Args, out out_args); // Collect parameters with Out flag from the request message // FIXME: This can be done in the unmanaged side and will be // more efficient ParameterInfo[] parameters = method.GetParameters(); object[] returnArgs = new object [parameters.Length]; int n = 0; int noa = 0; foreach (ParameterInfo par in parameters) { if (par.IsOut && !par.ParameterType.IsByRef) { returnArgs [n++] = reqMsg.GetArg(par.Position); } else if (par.ParameterType.IsByRef) { returnArgs [n++] = out_args [noa++]; } else { returnArgs [n++] = null; } } result = new ReturnMessage(rval, returnArgs, n, CallContext.CreateLogicalCallContext(true), reqMsg); } catch (Exception e) { result = new ReturnMessage(e, reqMsg); } CallContext.RestoreCallContext(oldContext); return(result); }