【问题标题】:AppDomain.AssemblyLoad event catches all exceptions raised within the event handlersAppDomain.AssemblyLoad 事件捕获事件处理程序中引发的所有异常
【发布时间】:2012-09-21 10:45:24
【问题描述】:

.NET AppDomain.AssemblyLoad 事件似乎捕获了它的事件处理程序中抛出的任何异常,而不是将它们传播给触发程序集加载的调用者(例如 Assembly.LoadFile())。

我的第一个问题是为什么会存在这种捕获所有异常的行为? Microsoft 通常非常严格地确保异常始终在其 BCL 中传播。

我的第二个问题,有没有办法关闭这种行为?

背景:我需要在加载程序集时对其进行扫描,并确保它们符合某些约定。如果不这样做,则应引发异常(并被可能触发程序集负载的多种机制捕获)。

注意:我已经找到了这个问题'Throw exception from AppDomain.AssemblyLoad event',不是重复的。我的问题逻辑上是从该问题的结论得出的。

【问题讨论】:

    标签: c# .net exception-handling appdomain .net-assembly


    【解决方案1】:

    不,异常被 CLR 吞没了,没有办法改变这种行为。大多数 AppDomain 事件都是这种情况:AssemblyLoad、DomainUnload 和 ProcessExit。 SSCLI20 源代码没有指示这样做的原因的 cmets。

    粗略的猜测是代码埋在 CLR 堆栈帧内太深,无法进行合理的诊断和展开帧,并且恢复状态太困难。 AssemblyLoad 因为几乎总是在抖动忙于生成代码时引发该事件,DomainUnload 和 ProcessExit 因为 CLR 忙于关闭所有代码执行。

    解决方法很明确,如果您必须捕获异常,那么您需要在事件处理程序中使用 try/catch 语句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      相关资源
      最近更新 更多