2013-05-07 100 views
3

好吧,所以我有一個MAF應用程序,它將每個插件加載到單獨的appdomain中。這對我所需要的功能非常有用,因爲它允許我在運行時動態卸載並重新加載我的插件。單獨的AppDomain中的C#,MAF,未處理的異常管理

的問題是,我需要能夠把未處理的異常在孩子的AppDomain,抓住它,然後讓該AppDomain中優雅地失敗,而不取下來父應用程序域

我如何去這樣做?這似乎是一個微不足道的任務和使用獨立應用程序的主要好處之一...

+0

MAF!= MEF ?? ...聽起來有趣 – 2013-05-07 22:44:57

+0

哈哈,希望我可以使用MEF,但缺乏模塊重新加載功能糟透了=( – 2013-05-07 23:44:10

回答

1

據我所知,你不能那樣開箱即用。您可以使用抽象類作爲加載項視圖,並在與模板方法模式結合的任何地方添加try/catch塊(即抽象加載項視圖中的Read方法調用加載項應實現的虛擬ReadCore函數)。仍然無法處理從子AppDomain的子線程拋出的未處理的異常。這些會使你的應用崩潰。

此外,據我所知,有兩種方式來處理這個問題:

  1. 使用進程隔離。這是確保加載項不會使主機崩潰的唯一方法。
  2. 請按照System.AddIn團隊博客中Using AppDomain Isolation to Detect Add-In Failures文章中介紹的方法進行操作。這種方法無法阻止您的應用程序崩潰,但您的應用程序將知道哪個加載項會導致崩潰。這是有價值的信息,因爲您的應用可以禁用不穩定的加載項,並避免在下次啓動時加載它們。或者應用程序可以通知用戶並讓他/她決定要做什麼。

請注意,這兩個是互補的。您可以從2開始,然後在不同的進程上加載不穩定的加載項。

0

傷口與出現今天被偉大的工作,但我仍然有一些挖做之前,我發現這種做法的後果的做法...

下面的博客文章幫助極大會: http://ikickandibite.blogspot.com/2010/04/appdomains-and-true-isolation.html

我只是啓用在App.config遺留未處理的異常策略:

(其中,作爲一個供參考,仍然可用,即使在.NET 4.5,這點我是擔心)

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
    </startup> 
    <runtime> 
     <legacyUnhandledExceptionPolicy enabled="true"/> 
    </runtime> 
</configuration> 

...從這點我可以使用AppDomain.UnhandledException事件來攔截未處理的異常並卸載子域...(請注意,我在這裏鬆散地說'攔截'...我仍然不是'捕捉'的例外,只是注意到它在卸載插件的過程中)

Collection<AddInToken> tokens = AddInStore.FindAddIns(typeof(IApplicationAddIn), pipelineStoreLocation, addInPath); 

foreach (AddInToken token in tokens) 
{ 
    AppDomain domain = AppDomain.CreateDomain(token.Name); 
    domain.UnhandledException += (sender, args) => 
     { 
      AppDomain _domain = (AppDomain) sender; 
      AppDomain.Unload(_domain); 
     }; 
    Console.WriteLine("Initializing add-in '{0}'", token.Name); 
    IAddIn addin = token.Activate<IAddIn>(domain); 

    try 
    { 
     addin.Initialize(this); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("Problem initializing add-in '{0}': {1}", token.Name, ex.Message); 
    } 
} 
+0

@JamesThurley你打敗了我的答案,我會給你信貸哈哈 – 2013-05-08 17:10:03