1

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

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

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

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

注意:我已经找到了这个问题'Throw exception from AppDomain.AssemblyLoad event',这不是重复的。我的问题合乎逻辑地源于该问题的结论。

4

1 回答 1

1

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

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

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

于 2012-09-21T13:00:25.153 回答