在使用C#的應用程序域的時候,碰到這麼一個異常:app
System.Runtime.Remoting.RemotingException: Object ‘/76e7cd41_2cd2_4e89_9c03_fae752ec4d59/zb_uualy_cm6kwizjlentfdl_3.rem’ has been disconnected or does not exist at the server.dom
當你使用AppDomain時,會建立一個Proxy繼承自MarshalByRefObject,來跨應用程序域傳值。而後在主AppDomain中,使用一個屬性或者Dictionary來保存Proxy的引用,但實際的對象是在子AppDomain中,你的主AppDomain中只是保存了一個遠程代理。url
這時,遠程對象的生命週期並非應用了.NET標準GC規則,而是用了Remoting Lease and Sponsor Mechanism(不知道對應的專業翻譯漢語名詞)。這意味着,除非咱們顯式管理子AppDomain的生命週期,不然它會被GC回收並消失,即使主AppDomain中仍然維護着遠程代理的引用。當你再次使用遠程代理訪問子AppDomain時,就拋出了上面的異常。。\(╯-╰)/ 。spa
(上面異常中,Object的名字是在你 AppDomain.CreateInstanceAndUnwrap 時,隨機生成的)翻譯
若是你但願能長期使用子AppDomain,不讓它過時,須要重寫Proxy類的 InitializeLifetimeService ,返回NULL便可。代理
原文:server
http://blogs.microsoft.co.il/sasha/2008/07/19/appdomains-and-remoting-life-time-service/ 對象
thx Sasha Goldshteinblog