2011-04-28 117 views
6

假設您已在.NET Remoting中註冊了兩個TcpChannel。在Activator上選擇特定頻道。GetObject

然後我嘗試使用Activator.GetObject使用URL tcp://...

是否有可能選擇使用哪個渠道獲得代理?

在此先感謝。

+0

只是一個說明:Remoting已被棄用WCF的青睞。 – Amy 2011-05-12 15:45:15

+0

@Inuyasha:是的,但有些人仍然使用劣勢。 NET :-( – 2011-05-12 15:59:04

回答

5

你解決了嗎?

我上週的問題完全一樣。 (nunit的一個輕微的未公開的副作用是,當加載你的DLL來運行單元測試(我的問題)時,它啓動默認的「tcp」通道...然後我創建了一個定製的TcpClientChannel實例,服務器軟件......我們匯不開火時,我實例化一個服務器對象)

有3個解決方案:

  1. 如果你想要一個永久覆蓋其他然後簡單地通過「優先「屬性到您的TcpClientChannel上的IDictionary構造函數中。如果未設置,則默認值爲1,因此如果您希望覆蓋默認的「tcp」通道註冊,則設置爲大於1.注意,「name」屬性也必須設置,但可以是string.Empty,如果需要(和那麼你可以有任意數量的你想要的)

  2. 在註冊時給你的頻道命名,然後寫一個漂亮的IDisposable包裝來調用「using」構造,該構造調用ChannelServices.Unregister(...)調用Activator.GetObject(...)時不想激活的通道。然後,當你的「使用」塊結束時(即調用Dispose()),只需重新加載未註冊的通道...確保在某些通用對象引用上使用「鎖定」瓶頸! (這是我採取的方法,因爲我的單元測試使用了預先創建服務器連接的庫:爲了我的單元測試而在生產軟件中出現不穩定的風險太高)

  3. 暫時在調用Activator.GetObject之前,使用深度反射來衝擊目標頻道的優先級(也就是擺弄私人FieldInfos ...即private int _channelPriority(我認爲)...使用反射器進行雙重檢查)。這也是線程問題的開放,也沒有框架版本的證明(所以我避免了這一個)