CopyNonByrefOutArgsFromOriginalArgs() private method

private CopyNonByrefOutArgsFromOriginalArgs ( RemotingMethodCachedData methodCache, Object args, Object &marshalResponseArgs ) : void
methodCache System.Runtime.Remoting.Metadata.RemotingMethodCachedData
args Object
marshalResponseArgs Object
return void
Ejemplo n.º 1
0
        [System.Security.SecurityCritical]  // auto-generated
        public void ServerCallback(IAsyncResult ar)
        {
            if (_asyncEnd != null) 
            {
                RemotingMethodCachedData asyncEndCache = (RemotingMethodCachedData) 
                    InternalRemotingServices.GetReflectionCachedData(_asyncEnd); 

                MethodInfo syncMI = (MethodInfo)_msg.MethodBase; 
                RemotingMethodCachedData syncCache = (RemotingMethodCachedData)
                    InternalRemotingServices.GetReflectionCachedData(syncMI);

                ParameterInfo[] paramList = asyncEndCache.Parameters; 

                // construct list to pass into End 
                Object[] parameters = new Object[paramList.Length]; 
                parameters[paramList.Length - 1] = ar; // last parameter is the async result
 
                Object[] syncMsgArgs = _msg.Args;

                // copy out and ref parameters to the parameters list
                AsyncMessageHelper.GetOutArgs(syncCache.Parameters, syncMsgArgs, parameters); 

                Object[] outArgs; 
 
                StackBuilderSink s = new StackBuilderSink(_serverObject);
                Object returnValue = 
                    s.PrivateProcessMessage(_asyncEnd.MethodHandle,
                        System.Runtime.Remoting.Messaging.Message.CoerceArgs(_asyncEnd, parameters, paramList),
                        _serverObject,
                        0, 
                        false,
                        out outArgs); 
 
                // The outArgs list is associated with the EndXXX method. We need to make sure
                //   it is sized properly for the out args of the XXX method. 
                if (outArgs != null)
                    outArgs = ArgMapper.ExpandAsyncEndArgsToSyncArgs(syncCache, outArgs);

                s.CopyNonByrefOutArgsFromOriginalArgs(syncCache, syncMsgArgs, ref outArgs); 

                IMessage retMessage = new ReturnMessage( 
                    returnValue, outArgs, _msg.ArgCount, CallContext.GetLogicalCallContext(), _msg); 

                AsyncProcessResponse(retMessage, null, null); 
            }
        } // ServerCallback
 public void ServerCallback(IAsyncResult ar)
 {
     if (this._asyncEnd != null)
     {
         object[] objArray3;
         RemotingMethodCachedData reflectionCachedData = InternalRemotingServices.GetReflectionCachedData((MethodBase) this._asyncEnd);
         MethodInfo methodBase = (MethodInfo) this._msg.MethodBase;
         RemotingMethodCachedData syncMethod = InternalRemotingServices.GetReflectionCachedData((MethodBase) methodBase);
         ParameterInfo[] parameters = reflectionCachedData.Parameters;
         object[] endArgs = new object[parameters.Length];
         endArgs[parameters.Length - 1] = ar;
         object[] args = this._msg.Args;
         AsyncMessageHelper.GetOutArgs(syncMethod.Parameters, args, endArgs);
         StackBuilderSink sink = new StackBuilderSink(this._serverObject);
         object ret = sink.PrivateProcessMessage(this._asyncEnd.MethodHandle, Message.CoerceArgs(this._asyncEnd, endArgs, parameters), this._serverObject, 0, false, out objArray3);
         if (objArray3 != null)
         {
             objArray3 = ArgMapper.ExpandAsyncEndArgsToSyncArgs(syncMethod, objArray3);
         }
         sink.CopyNonByrefOutArgsFromOriginalArgs(syncMethod, args, ref objArray3);
         IMessage msg = new ReturnMessage(ret, objArray3, this._msg.ArgCount, CallContext.GetLogicalCallContext(), this._msg);
         this.AsyncProcessResponse(msg, null, null);
     }
 }