2011-07-15 34 views
0

我使用MAF,我在激活插件時遇到問題。讓我解釋我的計劃。AddInToken.Activate中的捕獲異常<T>()

首先我創建了一個次要的AppDomain然後我嘗試激活插件:

MyAddIn = Token.Activate<AddInHostView>(domain); 

我的外接程序非常簡單,只引用一個幫手裝配。如果這個幫手程序集在AddIn的目錄中,所有的東西就像一個魅力一樣。

加載項

  • MyDemoAddIn.dll
  • Helpers.dll

如果我刪除Helpers.dll整個應用程序崩潰:

類型的第一次機會異常在MyDemoAddIn.DLL中發生'System.IO.FileNotFoundException' 'PresentationHost.exe'(Managed(v4 .0.30319)):加載'C:\ WINDOWS \ Microsoft.Net \程序集\ GAC_MSIL \ mscorlib.resources \ v4.0_4.0.0.0_de_b77a5c561934e089 \ mscorlib.resources.dll' 類型'System.Reflection。 TargetInvocationException'發生在mscorlib.dll System.AddIn.dll中發生類型'System.Reflection.TargetInvocationException'的第一次機會異常 System.AddIn.dll中發生第一次機會例外System.Reflection.TargetInvocationException異常

我用異常處理測試了所有東西。我不能趕上從主機外,AddInView或我創建的AppDomain :-(

有沒有人有一個想法?

回答

0

答案比你想象的要容易......問題是一個錯誤r從AddInView.dll(它是MAF的中間層)的Finalizer()方法中提取。這是我的解決方案。

演示(主機)

try 
{ 
    MyAddIn = Token.Activate<AddInHostView>(domain); 
} 
catch (Exception ex) 
{ 
    try 
    { 
     AppDomain.Unload(domain); 
     domain = null; 
    } 
    catch (ThreadAbortException threadAbortException) 
    { 
     //ToDo: Logging 
    } 
    catch (CannotUnloadAppDomainException cannotUnloadAppDomainException) 
    { 
     //ToDo: Logging 
    } 
    catch (Exception exception) 
    { 
     //ToDo: Logging 
    } 
} 

AddInView

[AddInBase] 
public class AddInView : UserControl 
{ 
    //Necessary constructor to handle the exception. 
    //Normal constructor is not called when an error occurs at startup!!! 
    static AddInView() 
    { 
     AppDomain.CurrentDomain.DomainUnload += CurrentDomain_DomainUnload; 
    } 

    //Normal constructor 
    public AddInView() 
    { 
     //Do other things... 
     //e.g. Dispatcher.UnhandledException += Dispatcher_UnhandledException; 
    } 

    static void CurrentDomain_DomainUnload(object sender, EventArgs e) 
    { 
     //To cleanup and stuff 
    } 
} 

現在,如果發生錯誤,(激活<>)異常處理程序捕獲錯誤(FileNotFound Helpers.dll不找到)並卸載整個AppDomain而不會崩潰的主AppDomain :-)

0

你的插件因爲它可以跨AppDomain的界限不能沒有Helpers.dll 運行時,插件需要它自己的一套的DLL加載到其自己的AppDomain。

如果您不需要跨AppDomain的功能,你可以使用Token.Activate<AddInHostView>(AppDomain.CurrentDomain)加載它,如果你已經在helpers.dll主機項目中引用。

+0

h elpers.dll也在主機項目中是正確的。但我需要能夠卸載mydemoaddin.dll。有什麼方法可以捕捉到錯誤? –