2 // System.Runtime.Remoting.StackBuilderSink.cs
4 // Author: Lluis Sanchez Gual (lsg@ctv.es)
6 // (C) 2002, Lluis Sanchez Gual
10 using System.Threading;
11 using System.Reflection;
13 namespace System.Runtime.Remoting.Messaging
15 // Sink that calls the real method of the object
17 public class StackBuilderSink: IMessageSink
19 MarshalByRefObject _target;
21 public StackBuilderSink (MarshalByRefObject obj)
26 public IMessage SyncProcessMessage (IMessage msg)
28 CheckParameters (msg);
30 // Makes the real call to the object
31 return RemotingServices.InternalExecuteMessage (_target, (IMethodCallMessage)msg);
34 public IMessageCtrl AsyncProcessMessage (IMessage msg, IMessageSink replySink)
36 object[] parms = new object[] {msg, replySink};
37 ThreadPool.QueueUserWorkItem (new WaitCallback (ExecuteAsyncMessage), parms);
41 void ExecuteAsyncMessage (object ob)
43 object[] parms = (object[]) ob;
44 IMethodCallMessage msg = (IMethodCallMessage) parms[0];
45 IMessageSink replySink = (IMessageSink)parms[1];
47 CheckParameters (msg);
48 IMessage res = RemotingServices.InternalExecuteMessage (_target, msg);
50 replySink.SyncProcessMessage (res);
53 public IMessageSink NextSink
58 void CheckParameters (IMessage msg)
60 IMethodCallMessage mcm = (IMethodCallMessage) msg;
62 MethodInfo mi = (MethodInfo) mcm.MethodBase;
64 ParameterInfo[] parameters = mi.GetParameters();
67 foreach (ParameterInfo pi in parameters)
69 object pval = mcm.GetArg (narg++);
70 Type pt = pi.ParameterType;
71 if (pt.IsByRef) pt = pt.GetElementType ();
73 if (pval != null && !pt.IsInstanceOfType (pval))
74 throw new RemotingException ("Cannot cast argument " + pi.Position + " of type '" + pval.GetType().AssemblyQualifiedName +
75 "' to type '" + pt.AssemblyQualifiedName + "'");