X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=mcs%2Fclass%2Fcorlib%2FSystem.Runtime.Remoting.Proxies%2FRealProxy.cs;h=fb0b4acb130ccf2f0e59ee43245c79c2323181bd;hb=15af51806d816ad6ad966bc1dfbdd232b63fde52;hp=d91011b67e3ac1045df7f8225cfa7c1056be7cbf;hpb=c4aef31eeea309e6a795c84c098ac8e1a2490340;p=mono.git diff --git a/mcs/class/corlib/System.Runtime.Remoting.Proxies/RealProxy.cs b/mcs/class/corlib/System.Runtime.Remoting.Proxies/RealProxy.cs index d91011b67e3..fb0b4acb130 100644 --- a/mcs/class/corlib/System.Runtime.Remoting.Proxies/RealProxy.cs +++ b/mcs/class/corlib/System.Runtime.Remoting.Proxies/RealProxy.cs @@ -40,29 +40,39 @@ using System.Runtime.Remoting.Activation; using System.Runtime.Remoting.Contexts; using System.Runtime.CompilerServices; using System.Runtime.Serialization; - +using System.Runtime.InteropServices; namespace System.Runtime.Remoting.Proxies { +#pragma warning disable 169, 649 + [StructLayout (LayoutKind.Sequential)] internal class TransparentProxy { public RealProxy _rp; IntPtr _class; bool _custom_type_info; } +#pragma warning restore 169, 649 + [ComVisible (true)] + [StructLayout (LayoutKind.Sequential)] public abstract class RealProxy { - + // other classes visible to the runtime + // derive from this class so keep these locals + // in sync with the definition RealProxy + // in object-internals.h + +#pragma warning disable 169, 414 #region Sync with object-internals.h Type class_to_proxy; internal Context _targetContext; MarshalByRefObject _server; int _targetDomainId = -1; internal string _targetUri; - #endregion - internal Identity _objectIdentity; Object _objTP; object _stubData; + #endregion +#pragma warning restore 169, 414 protected RealProxy () { @@ -107,8 +117,8 @@ namespace System.Runtime.Remoting.Proxies public virtual void GetObjectData (SerializationInfo info, StreamingContext context) { - Object obj = GetTransparentProxy(); - RemotingServices.GetObjectData (obj, info, context); + Object obj = GetTransparentProxy(); + RemotingServices.GetObjectData (obj, info, context); } internal Identity ObjectIdentity @@ -154,11 +164,16 @@ namespace System.Runtime.Remoting.Proxies MonoMethodMessage mMsg = (MonoMethodMessage) msg; mMsg.LogicalCallContext = CallContext.CreateLogicalCallContext (true); CallType call_type = mMsg.CallType; - bool is_remproxy = (rp as RemotingProxy) != null; +#if MOONLIGHT + bool is_remproxy = false; +#else + bool is_remproxy = (rp is RemotingProxy); +#endif + out_args = null; IMethodReturnMessage res_msg = null; - if (call_type == CallType.BeginInvoke) + if (call_type == CallType.BeginInvoke) // todo: set CallMessage in runtime instead mMsg.AsyncResult.CallMessage = mMsg; @@ -166,30 +181,46 @@ namespace System.Runtime.Remoting.Proxies res_msg = (IMethodReturnMessage)mMsg.AsyncResult.EndInvoke (); // Check for constructor msg - if (mMsg.MethodBase.IsConstructor) + if (mMsg.MethodBase.IsConstructor) { - if (is_remproxy) +#if !MOONLIGHT + if (is_remproxy) res_msg = (IMethodReturnMessage) (rp as RemotingProxy).ActivateRemoteObject ((IMethodMessage) msg); - else + else +#endif msg = new ConstructionCall (rp.GetProxiedType ()); } if (null == res_msg) { - res_msg = (IMethodReturnMessage)rp.Invoke (msg); - - // Note, from begining this code used AsyncResult.IsCompleted for - // checking if it was a remoting or custom proxy, but in some - // cases the remoting proxy finish before the call returns - // causing this method to be called, therefore causing all kind of bugs. - if ((!is_remproxy) && call_type == CallType.BeginInvoke) - { + bool failed = false; + + try { + res_msg = (IMethodReturnMessage)rp.Invoke (msg); + } catch (Exception ex) { + failed = true; + if (call_type == CallType.BeginInvoke) { + // If async dispatch crashes, don't propagate the exception. + // The exception will be raised when calling EndInvoke. + mMsg.AsyncResult.SyncProcessMessage (new ReturnMessage (ex, msg as IMethodCallMessage)); + res_msg = new ReturnMessage (null, null, 0, null, msg as IMethodCallMessage); + } else + throw; + } + + // Note, from begining this code used AsyncResult.IsCompleted for + // checking if it was a remoting or custom proxy, but in some + // cases the remoting proxy finish before the call returns + // causing this method to be called, therefore causing all kind of bugs. + if ((!is_remproxy) && call_type == CallType.BeginInvoke && !failed) + { IMessage asyncMsg = null; // allow calltype EndInvoke to finish asyncMsg = mMsg.AsyncResult.SyncProcessMessage (res_msg as IMessage); + out_args = res_msg.OutArgs; res_msg = new ReturnMessage (asyncMsg, null, 0, null, res_msg as IMethodCallMessage); - } + } } if (res_msg.LogicalCallContext != null && res_msg.LogicalCallContext.HasInfo) @@ -202,8 +233,12 @@ namespace System.Runtime.Remoting.Proxies out_args = null; throw exc.FixRemotingException(); } - else if (res_msg is IConstructionReturnMessage || mMsg.CallType == CallType.BeginInvoke) { - out_args = res_msg.OutArgs; + else if (res_msg is IConstructionReturnMessage) { + if (out_args == null) + out_args = res_msg.OutArgs; + } + else if (mMsg.CallType == CallType.BeginInvoke) { + // We don't have OutArgs in this case. } else if (mMsg.CallType == CallType.Sync) { out_args = ProcessResponse (res_msg, mMsg); @@ -212,7 +247,8 @@ namespace System.Runtime.Remoting.Proxies out_args = ProcessResponse (res_msg, mMsg.AsyncResult.CallMessage); } else { - out_args = res_msg.OutArgs; + if (out_args == null) + out_args = res_msg.OutArgs; } return res_msg.ReturnValue; @@ -242,6 +278,7 @@ namespace System.Runtime.Remoting.Proxies } [MonoTODO] + [ComVisible (true)] public IConstructionReturnMessage InitializeServerObject(IConstructionCallMessage ctorMsg) { throw new NotImplementedException(); @@ -314,7 +351,7 @@ namespace System.Runtime.Remoting.Proxies else if (par.ParameterType.IsByRef) { object outArg = par.Position < mrm.ArgCount ? mrm.GetArg (par.Position) : null; - if (outArg != null && !par.ParameterType.IsInstanceOfType (outArg)) + if (outArg != null && !par.ParameterType.GetElementType ().IsInstanceOfType (outArg)) { throw new InvalidCastException ("Return argument '" + par.Name + "' has an invalid type"); }