Вызовите исключение из события AppDomain.AssemblyLoad - PullRequest
5 голосов
/ 10 февраля 2011

Может кто-нибудь объяснить мне, почему я не могу выдать исключение из события загрузки 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 ]

1 голос
/ 10 февраля 2011

Почему вы думаете, что исключение не выбрасывается?Если бы его не выбросили, можно было бы ожидать, что вы увидите, что «Никогда не попадете сюда ...».Однако, поскольку его там нет, предположительно создается исключение.

Ваш код не перехватывает исключение - это совсем другая история.Вполне возможно, что код, который вызывает событие AppDomain.AssemblyLoad, перехватывает исключения.

1 голос
/ 10 февраля 2011

Исключение выдается.Но, похоже, .Net иногда игнорирует исключения, возникающие при запуске (Main ()).Я не уверен в причине, но обычно я захожу в «Отладка-> Исключения» и устанавливаю флажок «Бросить» для Общих Исключений времени выполнения », чтобы иметь возможность разбить исключение.

1 голос
/ 10 февраля 2011

Это происходит из-за того, как работает 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();
    }

Теперь статический конструктор может запускаться первым и регистрировать обработчик события AssemblyLoad до загрузки сборки ClassLibrary1.

0 голосов
/ 10 февраля 2011

Я считаю, что событие загрузки сборки происходит в отдельном потоке с использованием asynccallback. Вы не получаете исключение, потому что вам нужно использовать Application.ThreadException + = новый System.Threading.ThreadExceptionEventHandler (Application_ThreadException);

Я думаю, я вообще не специалист по этому вопросу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...