在AddInToken.Activate()中捕获异常

本文关键字:捕获异常 AddInToken Activate | 更新日期: 2023-09-27 18:02:37

我使用MAF,我有一个问题,激活插件。让我解释一下我的计划。

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

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

My AddIn非常简单,只引用了一个帮助程序集。如果此辅助程序集位于AddIn的目录中,则一切都很顺利。

外接程序

  • MyDemoAddIn.dll
  • Helpers.dll

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

System.IO类型的第一次机会异常。在MyDemoAddIn.DLL中发生FileNotFoundException'"PresentationHost.exe"(Managed (v4.0.30319)):已加载"C:'WINDOWS'Microsoft.Net'assembly'GAC_MSIL'mscorlib.resources'v4.0_4.0.0.0_de_b77a5c561934e089'mscorlib.resources.dll"类型为"System.Reflection"的第一次偶然异常。在mscorlib.dll中发生TargetInvocationException'类型为"System.Reflection"的第一次偶然异常。在System.AddIn.dll中发生TargetInvocationException类型为"System.Reflection"的第一次偶然异常。TargetInvocationException'在System.AddIn.dll中发生

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

)

有人有什么想法吗?

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

没有Helpers.dll插件无法运行因为它可以跨AppDomain边界工作,所以外接程序需要自己的一组dll来加载到自己的AppDomain中。

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

答案比你想象的要简单…问题是来自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<>)异常处理程序捕获错误(FileNotFound Helpers.dll未找到)并卸载整个AppDomain而不会崩溃主AppDomain:-)