我有一个WPF引导程序应用程序:它将我的应用程序UI从一个单独的程序集加载到另一个AppDomain然后显示主窗口。因此,应用程序UI将从此子域运行。
问题:如何处理从子域引发的主域中的异常?
为什么?因为我的目标是实现应用程序更新程序:当客户端意识到有新版本可用时,它会抛出一些带有特定消息的SystemException
。
我希望主机域处理此特定异常:卸载子域,从Internet下载最新的程序集版本,并通过重新加载最新的DLL来重新创建子域。
问题:在我看来,任何AppDomain中的未处理异常都会导致整个线程终止。我找到了一些blog post说明应该打开legacyUnhandledExceptionPolicy
以切换回.NET 1.0 / 1.1传统模式异常处理,但我不确定是否要使用此遗产在我的申请中。
还有其他方法可以正确处理其他AppDomains中的异常吗?
答案 0 :(得分:1)
处理自定义异常的一般方法' E'在AppDomain-A中导致的是在GAC中注册的程序集中定义此异常。因此,AppDomain-A引用此公共程序集,AppDomain-B(观察者)引用此程序集。
这是因为Exception
类是[Serializable]
,并且将通过域边界的值传递。一旦你通过边界获得blob,CLR将尝试反序列化它。因此CLR必须能够找到适合反序列化的类型。因此,反序列化将根据标准规则查找异常类型。
当然可能有另一种解决方案,其类型解析行为会改变潜水深度序列化/反序列化机制。
如果您想了解更多信息,请阅读Jeffry关于序列化机制和版本控制的书籍章节。
答案 1 :(得分:-1)
如果appdomain在另一个线程上运行,请使用AppDomain.UnhandledException事件处理程序处理新appdomain中未捕获的异常
newAppDomain.UnhandledException += new UnhandledExceptionEventHandler(ErrorHandler);
public void ErrorHandler(object sender, UnhandledExceptionEventArgs args)
{
Exception e = (Exception) args.ExceptionObject;
// handle here
}
另一种方法是使用AppDomain.Unload卸载appdomain,appdomain中的程序集应该处理AppDomain.DomainUnload事件以正常关闭。然后,您可以生成一个新的appdomain并重新开始。
这假设您在单独的线程上运行新的app域,否则您将需要处理来自父级的调用代码的异常,因为主线程上的未处理异常将中止该进程。