在Activator.GetObject上选择特定通道

时间:2011-04-28 11:10:58

标签: .net .net-remoting

假设您已在.NET Remoting中注册了两个TcpChannel。

然后,我尝试使用网址Activator.GetObject

使用tcp://...获取代理

是否可以选择使用哪个频道?

提前致谢。

1 个答案:

答案 0 :(得分:7)

你解决了这个问题吗?

上周我遇到了完全相同的问题。 (nunit的一个轻微的未公开的副作用是它在加载你的dll以运行单元测试时触发了默认的“tcp”通道(我的问题)...然后我创建了一个带有自定义接收器的自定义TcpClientChannel实例来与我们交谈服务器软件......当我实例化服务器对象时,我们的接收器没有触发)

有3个解决方案:

  1. 如果您希望永久覆盖另一个,则只需将“priority”属性传递给TcpClientChannel上的IDictionary构造函数。默认情况下,如果没有设置为1,所以如果你想要它覆盖说默认的“tcp”频道注册然后设置高于1.注意,“name”属性也必须设置,但如果需要可以是string.Empty(和那么你可以拥有你想要的那么多)

  2. 在注册时命名您的频道,然后编写一个好的IDisposable包装器来调用“using”结构,该结构在调用Activator时不想激活的通道上调用ChannelServices.Unregister(...) .GetObject(...)。然后,当你的“使用”块结束时(即调用Dispose()),只需重新加载你未注册的通道...如果你的应用程序中有多线程,请确保你对某些常见对象引用使用“锁定”...这可能会创建一个瓶颈! (这是我采用的方法,因为我的单元测试使用的是预先编写的库,它创建了服务器连接:为了我的单元测试,生产软件的不稳定风险太高了)

  3. 在调用Activator之前,暂时使用深度反射(即摆弄私有FieldInfos ...即私有int _channelPriority(我认为)...使用反射器进行双重检查)暂时阻止目标通道的优先级。 GetObject的。这也是线程问题的开放,也不是框架版本证明(所以我避免了这个)