Могу ли я изолировать мой текущий AppDomain от разрушения, когда другой загруженный AppDomain выдает необработанное исключение? - PullRequest
7 голосов
/ 22 октября 2011

Вероятно, копия: Могу ли я предотвратить случайное исключение в другом домене приложения при закрытии приложения?

Весь день пытался найти ответ на этот вопрос.

Просто хочу убедиться, что ответ действительно нет, прежде чем я выброшу весь код, который я сделал, чтобы изолировать мои драйверы внутри их отдельных доменов приложений и заменить его процессами старой школы.

Так чтоформальный вопрос заключается в следующем.

Имея домен по умолчанию "ad-default", в котором я создаю новый домен приложения "ad-hosted", могу ли я избежать необработанных исключений из "ad-hosted" tear-down ad-default "?

Мне известно, что я могу наблюдать за исключениями, подключившись к событию UnhandledException домена" на хостинге с рекламой ", но я не могу найти способ остановить их распространение на" объявление ".-default "домен.

Это правда?Но зачем нам вообще нужны AppDomain, если они не обеспечивают изоляцию?

РЕДАКТИРОВАТЬ: Ответ, к сожалению, НЕТ, см. Этот ответ для объяснения: AppDomain, обработка исключений

1 Ответ

3 голосов
/ 26 октября 2011

Единственный способ изолировать исключения в потоке в другом домене приложения от разрушения домена по умолчанию - использовать:

 <runtime>
    <legacyUnhandledExceptionPolicy enabled="1"/>
 <runtime>

Который установит для флага IsTerminating исключения unhandledexception значение false и предотвратит закрытие домена по умолчанию.

В нашем случае мы подключились к UnhandledExceptionHandler в обоих доменах. Затем мы запускаем semafore in в «ad-hosted», который будет выбран потоком, созданным для этой цели в «ad-default», который затем, в свою очередь, удаляет «ad-hosted»

Это хак и, вероятно, не доживет до будущих поколений фреймворка, но он делает "ad-default" более надежным в том смысле, что он не будет снесен при необработанных исключениях в "ad-hosted"

мы также подключаем обработчик событий в "ad-default", который будет преобразовывать отправителя в домен приложения, и проверять, возникла ли исключительная ситуация в "ad-default", в этом случае мы также отключаем "ad-default", эмулируя поведение .net 2.0, даже с настройкой времени выполнения, описанной выше.

Надеюсь, это даст кому-то подсказку, как сделать более гибкий хост плагина.

...