当我加载的另一个 AppDomain 引发未处理的异常时,我可以隔离我当前的 AppDomain 以防被拆除吗?

Posted

技术标签:

【中文标题】当我加载的另一个 AppDomain 引发未处理的异常时,我可以隔离我当前的 AppDomain 以防被拆除吗?【英文标题】:Can I isolate my current AppDomain from being torn down, when another AppDomain I've loaded throws an unhandled exception? 【发布时间】:2011-10-22 17:33:08 【问题描述】:

可能是:Can I prevent an uncaught exception in another AppDomain from shutting down the application?的副本

整天都在试图找出这个问题的答案。

只是想确保答案确实是否定的,然后在我丢弃我为将驱动程序隔离在其单独的应用程序域中而编写的所有代码并将其替换为老式进程之前。

所以正式的问题是这样的。

拥有一个默认域“ad-default”,我在其中创建了一个新的 appdomain“ad-hosted”,是否可以避免“ad-hosted”中未处理的异常导致“ad-default”失效?

我知道我可以通过连接到“广告托管”域的 UnhandledException 事件来观察异常,但我无法阻止它们传播到“广告默认”域。

这是真的吗?但是,如果 AppDomain 不提供隔离,我们为什么还要它们呢?

编辑: 不幸的是,答案是否定的,请参阅此答案以获得解释: AppDomain, handling the exceptions

【问题讨论】:

【参考方案1】:

将另一个应用程序域中的线程中的异常与拆除默认域隔离的唯一方法是使用:

 <runtime>
    <legacyUnhandledExceptionPolicy enabled="1"/>
 <runtime>

这会将未处理异常的 IsTerminating 标志设置为 false,并防止默认域关闭。

在我们的案例中,我们所做的是在两个域中连接到 UnhandledExceptionHandler。 然后我们在“ad-hosted”中触发一个 semafore,它将被“ad-default”中为此目的创建的线程拾取,然后依次处理“ad-hosted”

这是一个 hack,可能无法在框架的未来几代中继续存在,但它使“ad-default”更加健壮,因为它不会因“ad-hosted”中未处理的异常而被拆除

我们还在“ad-default”中连接了一个事件处理程序,它将发送者作为 appdomain 并检查异常是否源自“ad-default”,如果是,我们也拆除“ad-default”,模拟行为.net 2.0,即使使用上述运行时设置。

希望这可以为某人提供有关如何制作更具弹性的插件主机的线索。

【讨论】:

以上是关于当我加载的另一个 AppDomain 引发未处理的异常时,我可以隔离我当前的 AppDomain 以防被拆除吗?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以防止子 AppDomain 中的未处理异常导致主进程崩溃?

插件加载到 appDomain 的 mySQL 错误

Appdomain.Load(AssemblyName) 引发文件未找到异常

无法将泛型类型加载到 ASP.NET 应用程序中的另一个 AppDomain

AppDomain 未处理的异常

C#、MAF、单独 AppDomain 中的未处理异常管理