private SmuggledMethodCallMessage(IMethodCallMessage mcm) { this._uri = mcm.Uri; this._methodName = mcm.MethodName; this._typeName = mcm.TypeName; ArrayList argsToSerialize = (ArrayList)null; if (!(mcm is IInternalMessage internalMessage) || internalMessage.HasProperties()) { this._propertyCount = MessageSmuggler.StoreUserPropertiesForMethodMessage((IMethodMessage)mcm, ref argsToSerialize); } if (mcm.MethodBase.IsGenericMethod) { Type[] genericArguments = mcm.MethodBase.GetGenericArguments(); if (genericArguments != null && genericArguments.Length > 0) { if (argsToSerialize == null) { argsToSerialize = new ArrayList(); } this._instantiation = new MessageSmuggler.SerializedArg(argsToSerialize.Count); argsToSerialize.Add((object)genericArguments); } } if (RemotingServices.IsMethodOverloaded((IMethodMessage)mcm)) { if (argsToSerialize == null) { argsToSerialize = new ArrayList(); } this._methodSignature = new MessageSmuggler.SerializedArg(argsToSerialize.Count); argsToSerialize.Add(mcm.MethodSignature); } LogicalCallContext logicalCallContext = mcm.LogicalCallContext; if (logicalCallContext == null) { this._callContext = (object)null; } else if (logicalCallContext.HasInfo) { if (argsToSerialize == null) { argsToSerialize = new ArrayList(); } this._callContext = (object)new MessageSmuggler.SerializedArg(argsToSerialize.Count); argsToSerialize.Add((object)logicalCallContext); } else { this._callContext = (object)logicalCallContext.RemotingData.LogicalCallID; } this._args = MessageSmuggler.FixupArgs(mcm.Args, ref argsToSerialize); if (argsToSerialize == null) { return; } this._serializedArgs = CrossAppDomainSerializer.SerializeMessageParts(argsToSerialize).GetBuffer(); }
protected static object FixupArg(object arg, ref ArrayList argsToSerialize) { if (arg == null) { return((object)null); } if (arg is MarshalByRefObject marshalByRefObject) { if (!RemotingServices.IsTransparentProxy((object)marshalByRefObject) || RemotingServices.GetRealProxy((object)marshalByRefObject) is RemotingProxy) { ObjRef objRef = RemotingServices.MarshalInternal(marshalByRefObject, (string)null, (Type)null); if (objRef.CanSmuggle()) { if (!RemotingServices.IsTransparentProxy((object)marshalByRefObject)) { ServerIdentity identity = (ServerIdentity)MarshalByRefObject.GetIdentity(marshalByRefObject); identity.SetHandle(); objRef.SetServerIdentity(identity.GetHandle()); objRef.SetDomainID(AppDomain.CurrentDomain.GetId()); } ObjRef smuggleableCopy = objRef.CreateSmuggleableCopy(); smuggleableCopy.SetMarshaledObject(); return((object)new SmuggledObjRef(smuggleableCopy)); } } if (argsToSerialize == null) { argsToSerialize = new ArrayList(); } int count = argsToSerialize.Count; argsToSerialize.Add(arg); return((object)new MessageSmuggler.SerializedArg(count)); } if (MessageSmuggler.CanSmuggleObjectDirectly(arg)) { return(arg); } if (arg is Array array) { Type elementType = array.GetType().GetElementType(); if (elementType.IsPrimitive || elementType == typeof(string)) { return(array.Clone()); } } if (argsToSerialize == null) { argsToSerialize = new ArrayList(); } int count1 = argsToSerialize.Count; argsToSerialize.Add(arg); return((object)new MessageSmuggler.SerializedArg(count1)); }
protected static object[] UndoFixupArgs(object[] args, ArrayList deserializedArgs) { object[] objArray = new object[args.Length]; int length = args.Length; for (int index = 0; index < length; ++index) { objArray[index] = MessageSmuggler.UndoFixupArg(args[index], deserializedArgs); } return(objArray); }
protected static object[] FixupArgs(object[] args, ref ArrayList argsToSerialize) { object[] objArray = new object[args.Length]; int length = args.Length; for (int index = 0; index < length; ++index) { objArray[index] = MessageSmuggler.FixupArg(args[index], ref argsToSerialize); } return(objArray); }
internal object[] GetArgs(ArrayList deserializedArgs) => MessageSmuggler.UndoFixupArgs(this._args, deserializedArgs);