internal static IChannel CreateChannelFromConfigEntry(
RemotingXmlConfigFileData.ChannelEntry entry)
{
Type type = RemotingConfigInfo.LoadType(entry.TypeName, entry.AssemblyName);
bool isServerChannel = typeof(IChannelReceiver).IsAssignableFrom(type);
bool isClientChannel = typeof(IChannelSender).IsAssignableFrom(type);
IClientChannelSinkProvider clientProviderChain = null;
IServerChannelSinkProvider serverProviderChain = null;
if (entry.ClientSinkProviders.Count > 0)
clientProviderChain = CreateClientChannelSinkProviderChain(entry.ClientSinkProviders);
if (entry.ServerSinkProviders.Count > 0)
serverProviderChain = CreateServerChannelSinkProviderChain(entry.ServerSinkProviders);
// construct argument list
Object[] args;
if (isServerChannel && isClientChannel)
{
args = new Object[3];
args[0] = entry.Properties;
args[1] = clientProviderChain;
args[2] = serverProviderChain;
}
else
if (isServerChannel)
{
args = new Object[2];
args[0] = entry.Properties;
args[1] = serverProviderChain;
}
else
if (isClientChannel)
{
args = new Object[2];
args[0] = entry.Properties;
args[1] = clientProviderChain;
}
else
{
throw new RemotingException(
String.Format(
CultureInfo.CurrentCulture, Environment.GetResourceString("Remoting_Config_InvalidChannelType"),
type.FullName));
}
IChannel channel = null;
try
{
channel = (IChannel)Activator.CreateInstance(type,
BindingFlags.Instance | BindingFlags.Public | BindingFlags.CreateInstance,
null,
args,
null,
null);
}
catch (MissingMethodException)
{
String ctor = null;
if (isServerChannel && isClientChannel)
ctor = "MyChannel(IDictionary properties, IClientChannelSinkProvider clientSinkProvider, IServerChannelSinkProvider serverSinkProvider)";
else
if (isServerChannel)
ctor = "MyChannel(IDictionary properties, IServerChannelSinkProvider serverSinkProvider)";
else
if (isClientChannel)
ctor = "MyChannel(IDictionary properties, IClientChannelSinkProvider clientSinkProvider)";
throw new RemotingException(
String.Format(
CultureInfo.CurrentCulture, Environment.GetResourceString("Remoting_Config_ChannelMissingCtor"),
type.FullName, ctor));
}
return channel;
} // CreateChannelFromEntry