在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捕获异常:-(
)有人有什么想法吗?
没有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:-)