AppDomain.AssemblyLoad事件捕获事件处理程序中引发的所有异常

时间:2012-09-21 10:45:25

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

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

我的第一个问题是为什么会出现所有异常行为? Microsoft通常非常严格地确保异常总是在其BCL中传播。

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

背景:我需要在加载时扫描程序集,并确保它们符合某些约定。如果他们不这样做,则应该抛出异常(并且由于可能触发程序集加载的多个机制而被捕获更高)。

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

1 个答案:

答案 0 :(得分:1)

不,在CLR内部吞没异常,无法改变该行为。大多数AppDomain事件都是这种情况:AssemblyLoad,DomainUnload和ProcessExit。 SSCLI20源代码没有注释说明为什么这样做。

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

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