G>В .NET 4 необработанное исключение в потоке вызывает завершение домена приложения, поэтому если груpить недоверенный код, то только в отдельный домен.
G>Разные процессы — кросс-процессный маршалинг — дорого. Межу доменами должно получше работать.
В данный момент работаю над решением похожей задачи, хочу поделиться наработками, если не прав — поправьте. Если создать отдельный домен, загрузить в него сборку, создать инстанс объекта в новом домене, а для этого объекта создать прокси класс в "дефолтном" домене (используя метод Unwrap), то при возникновении исключения в новом домене, оно так же будет возникать и в "дефолтном", что приведет к уничтожению процесса, в котором находятся оба домена. Для случая, когда мы вызываем метод через прокси все предельно просто — может помочь try{}\catch{}. Для более сложных случаев, например когда в метод, который вызываеться из прокси класса делает что-то в отдельном треде, к примеру — ThreadPool.QueueUserWorkItem(delegate {Thread.Sleep(1000); throw new Exception();}) все немного сложнее.
На данный момент нам удалось побороть "падение" процесса для таких случаев, путем добавления
" <runtime>
<!-- the following setting prevents the host from closing when an unhandled exception is thrown -->
<legacyUnhandledExceptionPolicy enabled="1" />
</runtime> "
В конфигурационный файл исполнаяемого файла, который так же передается в создаваемый домен
var setup = new AppDomainSetup {
ApplicationBase = AppDomain.CurrentDomain.BaseDirectory,
ConfigurationFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Имя_исполняемого_файла.exe.config")};
Выгрузка же домена произоводиться при возникновении события UnhandledException созданного домена.
Если кто-то может подсказать более хорошее решение, буду очень благодарен.