106 lines
2.9 KiB
C#
106 lines
2.9 KiB
C#
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;
|
|
}
|
|
}
|