using System; using System.Reflection; using System.Runtime.Remoting.Proxies; using System.Threading; namespace System.Runtime.Remoting.Messaging { // Token: 0x02000408 RID: 1032 internal class StackBuilderSink : IMessageSink { // Token: 0x06002838 RID: 10296 RVA: 0x00083938 File Offset: 0x00081B38 public StackBuilderSink(MarshalByRefObject obj, bool forceInternalExecute) { this._target = obj; if (!forceInternalExecute && RemotingServices.IsTransparentProxy(obj)) { this._rp = RemotingServices.GetRealProxy(obj); } } // Token: 0x06002839 RID: 10297 RVA: 0x00083970 File Offset: 0x00081B70 public IMessage SyncProcessMessage(IMessage msg) { this.CheckParameters(msg); if (this._rp != null) { return this._rp.Invoke(msg); } return RemotingServices.InternalExecuteMessage(this._target, (IMethodCallMessage)msg); } // Token: 0x0600283A RID: 10298 RVA: 0x000839B0 File Offset: 0x00081BB0 public IMessageCtrl AsyncProcessMessage(IMessage msg, IMessageSink replySink) { object[] array = new object[] { msg, replySink }; ThreadPool.QueueUserWorkItem(new WaitCallback(this.ExecuteAsyncMessage), array); return null; } // Token: 0x0600283B RID: 10299 RVA: 0x000839E0 File Offset: 0x00081BE0 private void ExecuteAsyncMessage(object ob) { object[] array = (object[])ob; IMethodCallMessage methodCallMessage = (IMethodCallMessage)array[0]; IMessageSink messageSink = (IMessageSink)array[1]; this.CheckParameters(methodCallMessage); IMessage message; if (this._rp != null) { message = this._rp.Invoke(methodCallMessage); } else { message = RemotingServices.InternalExecuteMessage(this._target, methodCallMessage); } messageSink.SyncProcessMessage(message); } // Token: 0x170007E7 RID: 2023 // (get) Token: 0x0600283C RID: 10300 RVA: 0x00083A40 File Offset: 0x00081C40 public IMessageSink NextSink { get { return null; } } // Token: 0x0600283D RID: 10301 RVA: 0x00083A44 File Offset: 0x00081C44 private void CheckParameters(IMessage msg) { IMethodCallMessage methodCallMessage = (IMethodCallMessage)msg; ParameterInfo[] parameters = methodCallMessage.MethodBase.GetParameters(); int num = 0; foreach (ParameterInfo parameterInfo in parameters) { object arg = methodCallMessage.GetArg(num++); Type type = parameterInfo.ParameterType; if (type.IsByRef) { type = type.GetElementType(); } if (arg != null && !type.IsInstanceOfType(arg)) { throw new RemotingException(string.Concat(new object[] { "Cannot cast argument ", parameterInfo.Position, " of type '", arg.GetType().AssemblyQualifiedName, "' to type '", type.AssemblyQualifiedName, "'" })); } } } // Token: 0x04000FA4 RID: 4004 private MarshalByRefObject _target; // Token: 0x04000FA5 RID: 4005 private RealProxy _rp; } }