internal IMessageSink GetServerObjectChain(out MarshalByRefObject obj)
{
obj = null;
if (!this.IsSingleCall())
{
if (this._serverObjectChain == null)
{
bool lockTaken = false;
RuntimeHelpers.PrepareConstrainedRegions();
try
{
Monitor.Enter(this, ref lockTaken);
if (this._serverObjectChain == null)
{
MarshalByRefObject tPOrObject = base.TPOrObject;
this._serverObjectChain = this._srvCtx.CreateServerObjectChain(tPOrObject);
}
}
finally
{
if (lockTaken)
{
Monitor.Exit(this);
}
}
}
return(this._serverObjectChain);
}
MarshalByRefObject serverObj = null;
IMessageSink sink = null;
if (((base._tpOrObject != null) && (this._firstCallDispatched == 0)) && (Interlocked.CompareExchange(ref this._firstCallDispatched, 1, 0) == 0))
{
serverObj = (MarshalByRefObject)base._tpOrObject;
sink = this._serverObjectChain;
if (sink == null)
{
sink = this._srvCtx.CreateServerObjectChain(serverObj);
}
}
else
{
serverObj = (MarshalByRefObject)Activator.CreateInstance(this._srvType, true);
if (RemotingServices.GetObjectUri(serverObj) != null)
{
throw new RemotingException(string.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Remoting_WellKnown_CtorCantMarshal"), new object[] { base.URI }));
}
if (!RemotingServices.IsTransparentProxy(serverObj))
{
serverObj.__RaceSetServerIdentity(this);
}
else
{
RemotingServices.GetRealProxy(serverObj).IdentityObject = this;
}
sink = this._srvCtx.CreateServerObjectChain(serverObj);
}
obj = serverObj;
return(sink);
}