从AppDomain.AssemblyLoad事件中抛出异常

时间:2011-02-10 13:57:17

标签: c# .net exception

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

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...

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

编辑澄清一些事情:

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

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

4 个答案:

答案 0 :(得分:1)

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

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事件处理程序。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

您的代码捕捉异常是另一回事。引发AppDomain.AssemblyLoad事件的代码很可能是捕获异常。

答案 3 :(得分:0)

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

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