Могу ли я предотвратить отключение приложения из-за непредвиденного исключения в другом Домене приложений? - PullRequest
8 голосов
/ 11 октября 2010

У меня проблемы с неправильно поступившей библиотекой, которая выдает исключение в финализаторе, что, конечно, приводит к сбою приложения.

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

Как указано в MSDN, регистрация на AppDomain.UnhandledException не предотвращает всплытие исключения, но я весьма удивлен тем, что нет другого способа перехватить такое исключение в «подчиненном домене приложений».

Как хосты плагинов или приложения, использующие домены приложений для песочницы потенциально опасного кода, делают, чтобы остановить необработанные исключения? Действительно ли это возможно?

Примечание : у меня уже есть другой обходной путь, описанный здесь . Плохой финализатор находится на долгоживущем объекте, который, кажется, собирается только во время выключения, поэтому достаточно скрыть эту «поддельную» ошибку от пользователя. Тем не менее, я считаю этот обходной путь хрупким, поскольку он либо скрывает другие, реальные ошибки, либо рискует взорвать мое приложение, если объект был собран ранее.

Ответы [ 2 ]

4 голосов
/ 11 октября 2010

AppDomain хорош, так как вы можете изменить состояние программы, но у вас все еще есть проблема, что поток мертв.То, что это происходит в потоке финализатора, является фатальным, CLR прервет процесс без обращения к нему.

Единственное «исправление» - запуск этого компонента в своем собственном процессе.Вы можете выстрелить в голову с помощью Process.Kill (), чтобы предотвратить запуск потока финализатора при выходе из процесса.Используйте один из механизмов межпроцессного взаимодействия, который поддерживает .NET, чтобы поговорить с ним.Сокет, именованный канал, Remoting или WCF.Удачи с этим.

0 голосов
/ 12 мая 2011

На самом деле, в .NET 1.0 / 1.1 он вел себя так, как вам нужно. Вы все еще можете вернуться к этому поведению, просто добавив эту строку в файл конфигурации своего приложения внутри узла "среды выполнения":

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

Это предотвратит необработанное исключение в другом потоке от завершения всего процесса.

...