在AppDomain中A
我有一個對象o
類型T
。 T
既不是Serializable
也不是從MarshalByRefObject
派生。類型T
由我無法控制的插件主機提供。如何創建一個遠程對象的代理而不是派生自MarshalByRefObject?
我想創建一個AppDomain B
並通過代理o
到B
中的方法,但難倒:如何創建代理?
B
中的方法應該能夠調用o
上的方法並讀取屬性等。這些方法的結果必須以類似的方式進行代理。
在AppDomain中A
我有一個對象o
類型T
。 T
既不是Serializable
也不是從MarshalByRefObject
派生。類型T
由我無法控制的插件主機提供。如何創建一個遠程對象的代理而不是派生自MarshalByRefObject?
我想創建一個AppDomain B
並通過代理o
到B
中的方法,但難倒:如何創建代理?
B
中的方法應該能夠調用o
上的方法並讀取屬性等。這些方法的結果必須以類似的方式進行代理。
我建議您創建一個適當的代理對象,它實現與您嘗試代理的對象相同的接口,並且還從MarshalByRefObject繼承。然後您遠程代理對象。在服務器端,代理將委託給你的對象。
根據您的要求,服務器對象將包含您的對象作爲靜態(所有客戶端看到相同的對象)或非靜態(每個客戶端獲得新副本)。
對於靜態成員,您需要在服務器中創建代理並使用您的對象或第一個分配的代理(當第一個客戶端連接時)初始化它,然後創建對象並初始化它自己。我用過前者。
當然不要忘記租約。
你不能。在AppDomain之間進行通信的唯一方法是使用代理或使用副本(即可序列化)。
您可以將自己的類型包裝在代理中,該代理繼承自MarshalByRefObject
並使用它代替?
如果你想有一個代理,你最好的選擇很可能是封裝的對象類型內部的確實繼承MarshalByRefObject
(作爲一個私有域),以及具有公共方法等,使其可用;基本上是一個門面。
如果你想序列化 - 我會使用一個DTO是相關對象,但在一個不同的(可序列化)類型。只需發送狀態,並在另一端重建實際類型。
是的,我一直在考慮一個門面。是否有用於創建*整個API的外觀的庫?我正在研究代碼生成現在... – 2009-09-02 08:19:29
沒有我知道的 – 2009-09-02 08:22:21