using System.Collections;
using System.Reflection;
using System.Runtime.Serialization;
+using System.Runtime.Serialization.Formatters.Binary;
namespace System.Runtime.Remoting.Messaging {
[Serializable] [CLSCompliant (false)]
-#if NET_2_0
[System.Runtime.InteropServices.ComVisible (true)]
-#endif
public class MethodCall : IMethodCallMessage, IMethodMessage, IMessage, ISerializable, IInternalMessage, ISerializationRootObject
{
string _uri;
LogicalCallContext _callContext;
ArgInfo _inArgInfo;
Identity _targetIdentity;
-#if NET_2_0
Type[] _genericArguments;
-#endif
protected IDictionary ExternalProperties;
protected IDictionary InternalProperties;
Init();
ResolveMethod();
}
-
+#if FEATURE_REMOTING
+ internal MethodCall (Object handlerObject, BinaryMethodCallMessage smuggledMsg)
+ {
+ if (handlerObject != null)
+ {
+ _uri = handlerObject as String;
+ if (_uri == null)
+ {
+ // This must be the tranparent proxy
+ MarshalByRefObject mbr = handlerObject as MarshalByRefObject;
+ if (mbr != null)
+ {
+ throw new NotImplementedException ("MarshalByRefObject.GetIdentity");
+/*
+ bool fServer;
+ srvID = MarshalByRefObject.GetIdentity(mbr, out fServer) as ServerIdentity;
+ uri = srvID.URI;
+*/
+ }
+ }
+ }
+
+ _typeName = smuggledMsg.TypeName;
+ _methodName = smuggledMsg.MethodName;
+ _methodSignature = (Type[])smuggledMsg.MethodSignature;
+ _args = smuggledMsg.Args;
+ _genericArguments = smuggledMsg.InstantiationArgs;
+ _callContext = smuggledMsg.LogicalCallContext;
+
+ ResolveMethod();
+
+ if (smuggledMsg.HasProperties)
+ smuggledMsg.PopulateMessageProperties(Properties);
+ }
+#endif
internal MethodCall ()
{
}
case "__Args" : _args = (object[]) value; return;
case "__CallContext" : _callContext = (LogicalCallContext) value; return;
case "__Uri" : _uri = (string) value; return;
-#if NET_2_0
case "__GenericArguments" : _genericArguments = (Type[]) value; return;
-#endif
default: Properties[key] = value; return;
}
}
info.AddValue ("__Args", _args);
info.AddValue ("__CallContext", _callContext);
info.AddValue ("__Uri", _uri);
-#if NET_2_0
info.AddValue ("__GenericArguments", _genericArguments);
-#endif
if (InternalProperties != null) {
foreach (DictionaryEntry entry in InternalProperties)
internal virtual void InitDictionary()
{
- MethodCallDictionary props = new MethodCallDictionary (this);
+ var props = new MCMDictionary (this);
ExternalProperties = props;
InternalProperties = props.GetInternalProperties();
}
}
-#if NET_2_0
if (_methodBase.IsGenericMethod && _methodBase.ContainsGenericParameters) {
if (GenericArguments == null)
throw new RemotingException ("The remoting infrastructure does not support open generic methods.");
_methodBase = ((MethodInfo) _methodBase).MakeGenericMethod (GenericArguments);
}
-#endif
}
Type CastTo (string clientType, Type serverType)
static string GetTypeNameFromAssemblyQualifiedName (string aqname)
{
-#if NET_2_0
int p = aqname.IndexOf ("]]");
int i = aqname.IndexOf(',', p == -1 ? 0 : p + 2);
-#else
- int i = aqname.IndexOf(',');
-#endif
if (i != -1) aqname = aqname.Substring (0, i).Trim ();
return aqname;
}
set { _targetIdentity = value; }
}
-#if !NET_2_0
- public override string ToString ()
+ bool IInternalMessage.HasProperties()
{
- string s = _typeName.Split(',')[0] + "." + _methodName + " (";
- if (_args != null)
- {
- for (int n=0; n<_args.Length; n++)
- {
- if (n>0) s+= ", ";
- if (_args[n] != null) s += _args[n].GetType().Name + " ";
- s += GetArgName (n);
- if (_args[n] != null) s += " = {" + _args[n] + "}";
- else s+=" = {null}";
- }
- }
- s += ")";
- return s;
+ return (ExternalProperties != null) || (InternalProperties != null);
}
-#endif
-#if NET_2_0
Type[] GenericArguments {
get {
if (_genericArguments != null)
return _genericArguments = MethodBase.GetGenericArguments ();
}
}
-#endif
}
}