C#使用AppDomain時的異常分析:Object ‘XXXX.rem’ has been disconnected or does not exist at the server.

在使用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

相關文章
相關標籤/搜索