如何处理从另一个AppDomain抛出的异常?

时间:2015-07-08 10:54:53

标签: c# .net wpf exception appdomain

我有一个WPF引导程序应用程序:它将我的应用程序UI从一个单独的程序集加载到另一个AppDomain然后显示主窗口。因此,应用程序UI将从此子域运行。

问题:如何处理从子域引发的主域中的异常?

为什么?因为我的目标是实现应用程序更新程序:当客户端意识到有新版本可用时,它会抛出一些带有特定消息的SystemException

我希望主机域处理此特定异常:卸载子域,从Internet下载最新的程序集版本,并通过重新加载最新的DLL来重新创建子域。

问题:在我看来,任何AppDomain中的未处理异常都会导致整个线程终止。我找到了一些blog post说明应该打开legacyUnhandledExceptionPolicy以切换回.NET 1.0 / 1.1传统模式异常处理,但我不确定是否要使用此遗产在我的申请中。

还有其他方法可以正确处理其他AppDomains中的异常吗?

2 个答案:

答案 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域,否则您将需要处理来自父级的调用代码的异常,因为主线程上的未处理异常将中止该进程。

相关问题