TL; DR: Как вы изолируете исключения надстройки от убийства основного процесса?Изолировать исключения, брошенные в AppDomain, чтобы не сбой приложения
Я хочу иметь очень стабильное приложение .Net, которое работает с менее стабильным кодом в AppDomain
. Это, по-видимому, является одним из главных целей AppDomain
в первую очередь (ну, это и безопасная песочница), но он, похоже, не работает.
Например, в AddIn.exe
:
public static class Program
{
public static void Main(string[] args)
{
throw new Exception("test")
}
}
Called в моей 'стабильный' код с:
var domain = AppDomain.CreateDomain("sandbox");
domain.UnhandledException += (sender, e) => {
Console.WriteLine("\r\n ## Unhandled: " + ((Exception) e.ExceptionObject).Message);
};
domain.ExecuteAssemblyByName("AddIn.exe", "arg A", "arg B")
Исключение брошено в AppDomain
получает передается прямо в приложения, создавшего домен. Я могу зарегистрировать их с помощью domain.UnhandledException
и поймать их в приложении-оболочке.
Однако, есть более проблемные исключения брошенных, например:
public static class Program
{
public static void Main(string[] args)
{
Stackoverflow(1);
}
static int Stackoverflow(int x)
{
return Stackoverflow(++x);
}
}
Это бросает StackOverflow исключения, которое убивает все приложение каждый раз. Он даже не срабатывает domain.UnhandledException
- он просто подходит для убийства всего приложения.
Кроме того, призывающей вещь, как Environment.Exit()
внутри AppDomain
также убить родительское приложение, не проходит GO, не собирать £ 200 и не запускать любые ~Finialiser
или Dispose()
.
Похоже, что AppDomain
принципиально не выполняет то, что он утверждает (или в аренду, что, по-видимому, требует), поскольку он просто передает все исключения прямо в родительский домен, делая его бесполезным для изоляции и довольно слабый для любой безопасности (если я могу вынести родительский процесс, я могу, возможно, поставить под угрозу работу машины). Это было бы довольно фундаментальным сбоем в .Net, поэтому я должен что-то пропускать в своем коде.
Я что-то упустил? Есть ли способ сделать AppDomain
действительно изолировать код, который он запускает и выгружает, когда что-то происходит плохо? Я использую неправильную вещь и есть ли какая-то другая функция .Net, которая обеспечивает изоляцию исключений?
Ну, просто потому, что ваши сбои приложений не обязательно означают, что в .NET существует фундаментальный недостаток. Может, у вашего кода что-то не хватает? https://msdn.microsoft.com/en-us/magazine/cc163701.aspx – MickyD
@ MickyDuncan вы прочитали нижнюю часть вопроса? Это именно то, что я прошу! – Keith