public unsafe static void UnregisterChannel(IChannel chnl)
{
bool flag = false;
RuntimeHelpers.PrepareConstrainedRegions();
try
{
Monitor.Enter(ChannelServices.s_channelLock, ref flag);
if (chnl != null)
{
RegisteredChannelList registeredChannelList = ChannelServices.s_registeredChannels;
int num = registeredChannelList.FindChannelIndex(chnl);
if (-1 == num)
{
throw new RemotingException(Environment.GetResourceString("Remoting_ChannelNotRegistered", new object[]
{
chnl.ChannelName
}));
}
RegisteredChannel[] registeredChannels = registeredChannelList.RegisteredChannels;
RegisteredChannel[] array = new RegisteredChannel[registeredChannels.Length - 1];
IChannelReceiver channelReceiver = chnl as IChannelReceiver;
if (channelReceiver != null)
{
channelReceiver.StopListening(null);
}
int num2 = 0;
int i = 0;
while (i < registeredChannels.Length)
{
if (i == num)
{
i++;
}
else
{
array[num2] = registeredChannels[i];
num2++;
i++;
}
}
if (ChannelServices.perf_Contexts != null)
{
ChannelServices.perf_Contexts->cChannels--;
}
ChannelServices.s_registeredChannels = new RegisteredChannelList(array);
}
ChannelServices.RefreshChannelData();
}
finally
{
if (flag)
{
Monitor.Exit(ChannelServices.s_channelLock);
}
}
}