using System.Runtime.Remoting.Contexts;
using System.Runtime.Remoting.Lifetime;
using System.Runtime.Remoting.Proxies;
+using System.Runtime.Remoting.Services;
namespace System.Runtime.Remoting
{
public void AttachServerObject (MarshalByRefObject serverObject, Context context)
{
+ DisposeServerObject();
+
_context = context;
_serverObject = serverObject;
if (RemotingServices.IsTransparentProxy (serverObject))
{
RealProxy rp = RemotingServices.GetRealProxy (serverObject);
- rp.ObjectIdentity = this;
+ if (rp.ObjectIdentity == null)
+ rp.ObjectIdentity = this;
}
else
{
// object is marshalled again.
if (_serverObject != null) {
+ MarshalByRefObject obj = _serverObject;
_serverObject.ObjectIdentity = null;
_serverObject = null;
+ _serverSink = null;
+ TrackingServices.NotifyDisconnectedObject (obj);
}
}
}
// SingleCallIdentity creates and disposes an instance in each call
MarshalByRefObject obj = (MarshalByRefObject)Activator.CreateInstance (_objectType, true);
- obj.ObjectIdentity = this;
+ if (obj.ObjectIdentity == null) obj.ObjectIdentity = this;
IMessageSink serverSink = _context.CreateServerObjectSinkChain (obj, false);
IMessage result = serverSink.SyncProcessMessage (msg);
if (obj is IDisposable) ((IDisposable)obj).Dispose();