在AddInToken.Activate <t>()</t>中捕获异常

时间:2011-07-15 10:03:22

标签: c# wpf exception add-in maf

我使用MAF并且我在激活插件时遇到问题。让我来解释一下我的计划。

首先我创建一个辅助AppDomain,然后尝试激活插件:

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

我的AddIn非常简单,只引用了一个帮助程序集。如果这个帮助程序集位于AddIn的目录中,那么所有东西都像魅力一样。

外接程序

  • MyDemoAddIn.dll
  • Helpers.dll

如果我删除了Helpers.dll整个应用程序崩溃:

  

MyDemoAddIn.DLL中出现'System.IO.FileNotFoundException'类型的第一次机会异常   'PresentationHost.exe'(托管(v4.0.30319)):已加载'C:\ WINDOWS \ Microsoft.Net \ assembly \ GAC_MSIL \ mscorlib.resources \ v4.0_4.0.0.0_de_b77a5c561934e089 \ mscorlib.resources.dll'   mscorlib.dll中发生了'System.Reflection.TargetInvocationException'类型的第一次机会异常   System.AddIn.dll中发生了'System.Reflection.TargetInvocationException'类型的第一次机会异常   System.AddIn.dll中发生了'System.Reflection.TargetInvocationException'类型的第一次机会异常

我用异常处理测试了所有东西。我无法从Host,AddInView或我创建的AppDomain中捕获异常: - (

有没有人有想法?

2 个答案:

答案 0 :(得分:0)

如果没有Helpers.dll,您的插件无法运行 因为它适用于AppDomain边界,所以addin需要它自己的一组DLL才能加载到它自己的AppDomain中。

如果您不需要跨AppDomain功能,如果您在主机项目中引用了helpers.dll,则可以使用Token.Activate<AddInHostView>(AppDomain.CurrentDomain)加载它。

答案 1 :(得分:0)

答案比你想象的要容易......问题是来自AddInView.dll的Finalizer()方法中的一个错误,它是MAF的夹层。这是我的解决方案。

演示(主持人)

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
    }
}

现在,如果发生错误(Activate&lt;&gt;),异常处理程序会捕获错误(找不到FileNotFound Helpers.dll)并卸载整个AppDomain而不会崩溃主AppDomain: - )