2009-06-11 35 views
1

有沒有一種方法可以跨AppDomains有效地共享或移動.NET對象?我意識到AppDomains的意圖是提供隔離 - 但是我有一種情況,我需要移動一個相對較大的緩存的不可變對象集合,這些對象的計算和創建都很昂貴。目前,我有一套可行的序列化方法,但速度很慢。在.NET中跨AppDomains移動對象

回答

4

你離不開其序列間移動一個AppDomain的對象。這是AppDomain的主要觀點 - 您幾乎可以將其視爲一個完全獨立的過程。

這是MarshallByRefObject用武之地。它允許您通過遠程處理從另一個AppDomain使用使用對象,而不必通過AppDomain邊界將其序列化。您仍然通過遠程處理工作,所以它會比將對象保留在同一個AppDomain中慢,但是如果對象很大並且很少使用它,與序列化和反序列化相比,這可以節省大量時間它在第二個AppDomain中創建一個新副本。

2

有一兩件事你可以嘗試是從MarshalByRefObject派生的對象。默認情況下,對象按AppDomains按值進行編組。對於派生自MarshalByRefObject的對象,調用者被賦予對象的代理。所有呼叫都通過代理,然後被編組到對象的應用程序域。這可以減少在兩個應用程序域中創建所有對象的副本的需求。

0

我相信,只有少數「福地」對象是能夠「元帥的流血」,即只是讓跨邊界漂移(字符串是一個)

遠程處理呼叫,如果他們是矮胖應該工作而不是試圖整個事情整個複製(大內存浪費,如果沒有別的)

1

如何創建用於管理共享對象的一個​​單獨的應用空間,然後使用或者Web服務或遠程獲取/共享數據集合?您將本質上創建一箇中央內存(取決於您如何存儲數據)存儲庫。

0

.NET Remoting是我知道的最好的方法,雖然我有相當的經驗有限。如果你想使用它,你需要閱讀Ingo Rammer的高級.NET Remoting,第二版和 Mario Szpuszta。當你開始使用Google Remoting時,Ingo的名字會頻繁彈出。我發現這本書現在有點過時了,但相當有價值。我還沒有嘗試過使用大型二進制序列化對象,但對於我一直在使用的較小對象似乎很有效。我發現你不能擁有SecureString屬性的對象,除非你想爲它們實現自定義的序列化/反序列化。