Только управляемая память изолирована между доменами приложений.Если поток генерирует исключение в каком-либо из доменов приложений, это приведет к сбою всего приложения.
Я думаю, что лучшим решением является обеспечение правильной обработки всех исключений в каждом потоке (или рабочих элементах пула потоков).
Однако существует хак, который заключается в применении этой конфигурации в файле App.Config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<runtime>
<legacyUnhandledExceptionPolicy enabled="1"/>
</runtime>
</configuration>
Необработанные исключения приводят к сбою процесса начиная с .Net 2.0, но вы можете вернуться кстарая политика, использующая этот трюк.
Я бы использовал это осторожно, поскольку часто лучше позволить процессам аварийно завершать работу, чем молча.Вы можете добавить трассировки в AppDomain.UnhandledException, чтобы получать уведомления при возникновении необработанного исключения и обрабатывать их соответствующим образом.
EDIT
Вы правы в отношении StackOveflowException, поскольку .Net 2.0 этоисключение не может быть обработано кодом пользователя.(См. Раздел «Примечания» этой страницы в msdn ).
Существует способ переопределить это, создав собственный хост CLR, но это кажется сумасшедшей вещью.Я думаю, вам придется с этим смириться или вы можете создать дочерний процесс вместо AppDomain, если вам действительно нужен такой отказоустойчивый тип.