好吧,所以我有一個MAF應用程序,它將每個插件加載到單獨的appdomain中。這對我所需要的功能非常有用,因爲它允許我在運行時動態卸載並重新加載我的插件。單獨的AppDomain中的C#,MAF,未處理的異常管理
的問題是,我需要能夠把未處理的異常在孩子的AppDomain,抓住它,然後讓該AppDomain中優雅地失敗,而不取下來父應用程序域
我如何去這樣做?這似乎是一個微不足道的任務和使用獨立應用程序的主要好處之一...
好吧,所以我有一個MAF應用程序,它將每個插件加載到單獨的appdomain中。這對我所需要的功能非常有用,因爲它允許我在運行時動態卸載並重新加載我的插件。單獨的AppDomain中的C#,MAF,未處理的異常管理
的問題是,我需要能夠把未處理的異常在孩子的AppDomain,抓住它,然後讓該AppDomain中優雅地失敗,而不取下來父應用程序域
我如何去這樣做?這似乎是一個微不足道的任務和使用獨立應用程序的主要好處之一...
據我所知,你不能那樣開箱即用。您可以使用抽象類作爲加載項視圖,並在與模板方法模式結合的任何地方添加try/catch塊(即抽象加載項視圖中的Read方法調用加載項應實現的虛擬ReadCore函數)。仍然無法處理從子AppDomain的子線程拋出的未處理的異常。這些會使你的應用崩潰。
此外,據我所知,有兩種方式來處理這個問題:
System.AddIn
團隊博客中Using AppDomain Isolation to Detect Add-In Failures文章中介紹的方法進行操作。這種方法無法阻止您的應用程序崩潰,但您的應用程序將知道哪個加載項會導致崩潰。這是有價值的信息,因爲您的應用可以禁用不穩定的加載項,並避免在下次啓動時加載它們。或者應用程序可以通知用戶並讓他/她決定要做什麼。請注意,這兩個是互補的。您可以從2開始,然後在不同的進程上加載不穩定的加載項。
傷口與出現今天被偉大的工作,但我仍然有一些挖做之前,我發現這種做法的後果的做法...
下面的博客文章幫助極大會: 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);
}
}
@JamesThurley你打敗了我的答案,我會給你信貸哈哈 – 2013-05-08 17:10:03
MAF!= MEF ?? ...聽起來有趣 – 2013-05-07 22:44:57
哈哈,希望我可以使用MEF,但缺乏模塊重新加載功能糟透了=( – 2013-05-07 23:44:10