从AppDomain.AssemblyLoad事件中抛出exception

有人可以向我解释为什么我似乎无法从AppDomain.Assembly加载事件中抛出exception? 例如:

class Program { static Program() { AppDomain.CurrentDomain.UnhandledException += (s, a) => { Console.WriteLine("Caught exception!"); }; AppDomain.CurrentDomain.AssemblyLoad += (s, a) => { Console.WriteLine(string.Format("Assembly {0} loaded", a.LoadedAssembly.FullName)); throw new Exception(); Console.WriteLine("Should never get here..."); }; } static void Main(string[] args) { Console.WriteLine(new ClassLibrary1.Class1().TestString()); Console.WriteLine(); Console.WriteLine("Done..."); Console.ReadLine(); } } 

当我执行它时,输出如下:

 Assembly ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null loaded TestString Done... 

任何人都可以向我解释这种行为吗? 谢谢。

编辑澄清一些事情:

  • 当我希望它运行时,程序集加载事件运行正常。 但我的exception永远不会被抛出

  • 这是一个从较大的应用程序中提取的蒸馏示例。 我想在装载后检查assembly,如果我不喜欢它,我想要快速失败……但是我的例外不会“发生”

为什么你认为exception没有被抛出? 如果它没有被抛出,人们会期望看到你的“永远不会到达……”输出。 但是,由于它不存在,所以可能会抛出exception。

您的代码没有捕获exception是另一个故事。 提升AppDomain.AssemblyLoad事件的代码很可能是捕获exception。

这是因为JIT编译器的工作方式。 它需要在Main()方法开始运行之前生成代码。 由于您引用的是ClassLibrary1.Class1()类型,因此需要加载该程序集以检索类型信息。 这需要它代码开始运行之前加载程序集。 像这样更改以获得exception:

 using System.Runtime.CompilerServices; ... static void Main(string[] args) { Test(); } [MethodImpl(MethodImplOptions.NoInlining)] static void Test() { Console.WriteLine(new ClassLibrary1.Class1().TestString()); Console.WriteLine(); Console.WriteLine("Done..."); Console.ReadLine(); } 

现在,静态构造函数可以先运行并在加载ClassLibrary1程序集之前注册AssemblyLoad事件处理程序。

抛出exception。 但似乎.Net有时会忽略启动时发生的exception(Main())。 我不确定原因,但我通常会进入Debug-> Exceptions并选中“抛出公共语言运行时exception”框,以便能够在例外情况下中断。

我相信程序集加载事件发生在一个单独的线程上,使用asynccallback。 您没有得到exception,因为您需要使用Application.ThreadException + = new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);

我想,我根本就不是这方面的专家