我使用MAF并且我在激活插件时遇到问题。让我来解释一下我的计划。
首先我创建一个辅助AppDomain,然后尝试激活插件:
MyAddIn = Token.Activate<AddInHostView>(domain);
我的AddIn非常简单,只引用了一个帮助程序集。如果这个帮助程序集位于AddIn的目录中,那么所有东西都像魅力一样。
外接程序
如果我删除了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中捕获异常: - (
有没有人有想法?
答案 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: - )