В настоящее время я разрабатываю полностью модульное приложение .NET, в котором:
- Существует приложение хоста, которое загружает DDL-модули.У модулей DDL есть формы, которые можно открывать несколько раз.
- Вы можете выгрузить домен приложения.Это приведет к тому, что все открытые формы модуля будут закрыты.
Что я хочу сделать, это когда в модуле происходит необработанное исключение, приложение должно выгрузить DDL этого модуля и предотвратить сбой хоста.
Я попытался использовать событие AppDomain.UnhandledException, которому сразу после создания домена AppDomain был назначен обработчик, как показано ниже:
// Creates the ApplicationDomain
this._applicationDomain = AppDomain.CreateDomain(this.AppDomainName);
this._applicationDomain.UnhandledException += new UnhandledExceptionEventHandler(_applicationDomain_UnhandledException);
Проблема в том, что обработчик никогда не вызывается.Microsoft говорит здесь , что
Например, предположим, что поток запускается в домене приложения "AD1", вызывает метод в домене приложения "AD2" и оттуда вызывает метод вДомен приложения "AD3", где он выдает исключение.Первым доменом приложения, в котором может быть вызвано событие UnhandledException, является «AD1».Если этот домен приложения не является доменом приложения по умолчанию, событие также может быть вызвано в домене приложения по умолчанию.
Даже после того, как я назначил обработчик, исключение по-прежнему переходит в
Application.Run (new HostForm ());
Я полагаю, что если бы я создал новый цикл сообщений для формы каждого модуля, он бы работал, потому что тогда поток, в котором будет выполняться форма, будет разделеннить, но это, кажется, глупое решение.
Другая идея, которую я имел, состояла в том, чтобы использовать, кроме события AppDomain.UnhandledException домена приложения по умолчанию, но как я могу тогда:
- Откройте для себя AppDomain происхождения и, следовательно, модуль для выгрузки?
- Предотвратить смерть приложения?(Я попытался сделать это, и e.IsTerminating имеет истинное значение, и исключение все еще сохраняется в
Кто-нибудь? Пожалуйста, мне действительно это нужно.