Dan*_*lba 6 .net .net-remoting
假设您已在.NET Remoting中注册了两个TcpChannel.
然后我尝试Activator.GetObject使用url 获取代理tcp://...
是否可以选择使用哪个频道?
提前致谢.
小智 7
你解决了吗?
我上周遇到了完全相同的问题.(nunit的一个轻微的未公开的副作用是它在加载你的dll以运行单元测试时触发了默认的"tcp"通道(我的问题)...然后我创建了一个带有自定义接收器的自定义TcpClientChannel实例来与我们交谈服务器软件......当我实例化服务器对象时,我们的接收器没有触发)
有3种解决方案:
如果您希望永久覆盖另一个,则只需将"priority"属性传递给TcpClientChannel上的IDictionary构造函数.默认情况下,如果没有设置为1,所以如果你想要它覆盖说默认的"tcp"频道注册然后设置高于1.注意,"name"属性也必须设置,但如果需要可以是string.Empty(和然后你可以拥有你想要的尽可能多的这些)
在注册时命名你的频道,然后编写一个漂亮的IDisposable包装器来调用"using"结构,该结构在调用Activator.GetObject时调用你不想激活的通道上的ChannelServices.Unregister(...)(... ).然后,当你的"使用"块结束时(即调用Dispose()),只需重新加载你未注册的通道...如果你的应用程序中有多线程,请确保你对某些常见对象引用使用"锁定"...这可能会创建一个瓶颈!(这是我采用的方法,因为我的单元测试使用的是预先编写的库,它创建了服务器连接:为了我的单元测试,生产软件的不稳定风险太高)
在调用Activator.GetObject之前,使用深度反射暂时突破目标通道的优先级(即摆弄私有FieldInfos ...即私有int _channelPriority(我认为)...使用反射器进行双重检查).这也是线程问题的开放,也不是框架版本证明(所以我避免了这个)