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;
protected IDictionary ExternalProperties;
protected IDictionary InternalProperties;
- public MethodCall (Header [] headers)
+ public MethodCall (Header [] h1)
{
Init();
- if (headers == null || headers.Length == 0) return;
+ if (h1 == null || h1.Length == 0) return;
- foreach (Header header in headers)
+ foreach (Header header in h1)
InitMethodProperty (header.Name, header.Value);
ResolveMethod ();
set { _uri = value; }
}
+ string IInternalMessage.Uri {
+ get { return Uri; }
+ set { Uri = value; }
+ }
+
public object GetArg (int argNum)
{
return _args[argNum];
}
Type requestType = CastTo (_typeName, type);
+ if (requestType == null)
+ throw new RemotingException ("Cannot cast from client type '" + _typeName + "' to server type '" + type.FullName + "'");
+
+ // Look for the method in the requested type. The method signature is provided
+ // only if the method is overloaded in the requested type.
+ _methodBase = RemotingServices.GetMethodBaseFromName (requestType, _methodName, _methodSignature);
- if (requestType != null) {
- _methodBase = RemotingServices.GetMethodBaseFromName (requestType, _methodName, _methodSignature);
- if (_methodBase == null) throw new RemotingException ("Method " + _methodName + " not found in " + type);
+ if (_methodBase == null)
+ throw new RemotingException ("Method " + _methodName + " not found in " + requestType);
+
+ // If the method is implemented in an interface, look for the method implementation.
+ // It can't be done in the previous GetMethodBaseFromName call because at that point we
+ // may not yet have the method signature.
+ if (requestType != type && requestType.IsInterface && !type.IsInterface) {
+ _methodBase = RemotingServices.GetVirtualMethod (type, _methodBase);
+ if (_methodBase == null)
+ throw new RemotingException ("Method " + _methodName + " not found in " + type);
}
- else
- throw new RemotingException ("Cannot cast from client type '" + _typeName + "' to server type '" + type.FullName + "'");
+
} else {
_methodBase = RemotingServices.GetMethodBaseFromMethodMessage (this);
if (_methodBase == null) throw new RemotingException ("Method " + _methodName + " not found in " + TypeName);
_methodBase = ((MethodInfo) _methodBase).MakeGenericMethod (GenericArguments);
}
#endif
-
}
Type CastTo (string clientType, Type serverType)
}
[MonoTODO]
- public void RootSetObjectData (SerializationInfo info, StreamingContext context)
+ public void RootSetObjectData (SerializationInfo info, StreamingContext ctx)
{
throw new NotImplementedException ();
}
set { _targetIdentity = value; }
}
+#if !NET_2_0
public override string ToString ()
{
string s = _typeName.Split(',')[0] + "." + _methodName + " (";
s += ")";
return s;
}
+#endif
#if NET_2_0
Type[] GenericArguments {