Подтвердить что ты не робот

Могу ли я запускать код С# в отдельном процессе без создания консольного приложения?

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

Я знаю, что могу создать отдельный проект консольного приложения, чтобы вызвать статический метод изнутри Main(), но это не удобно для моего сценария развертывания - я бы предпочел не переносить дополнительный .exe файл. Я знаю, что могу использовать Powershell, чтобы вызвать его, но это будет означать зависимость от Powershell, которую я бы предпочел избежать.

Есть ли способ запустить код в отдельном процессе, используя только .NET? Может быть, я могу создать исполняемый файл для этого отдельного процесса во время выполнения?

4b9b3361

Ответ 1

К сожалению, вы не можете fork на С#, как в C на совместимых с POSIX операционных системах.

У вас есть несколько вариантов. Поскольку вы просто пытаетесь защитить от бесконечных циклов, вы можете просто создать новый Thread (новый, а не ThreadPool один или Task). Затем вы можете вызвать Abort в потоке, если вам нужно его убить. Это вызовет ThreadAbortException в другом потоке.

Другой вариант - AppDomain. Вы можете создать новый AppDomain с помощью текущей запущенной сборки относительно тривиально. Затем вы делаете вызов в прокси-объект, который фактически существует через домена. Прокси-сервер будет использовать удаленную удаленную платформу для старой школы .NET, чтобы вызвать метод на реальном объекте (так что нет общего прохода и т.д., Поскольку вы ограничены конструкциями на основе .NET 1.1).

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

Если вы действительно действительно настроены на получение второго процесса на уровне ОС, вы также можете генерировать новую исполняемую сборку во временном файле на лету и запускать ее в новом процессе. См. здесь статью MSDN о генерации новой сборки. Имейте в виду, что это вообще не тривиально.