コード例 #1
0
        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();
        }
コード例 #2
0
        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));
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
 internal object[] GetArgs(ArrayList deserializedArgs) => MessageSmuggler.UndoFixupArgs(this._args, deserializedArgs);