Как правильно завершить работу консольного приложения, запущенного с Process.Start?

Это похоже на невыполнимую задачу. Абсолютно ничего я не нашел работ. Вопрос в том, как правильно закрыть консольное приложение, запущенное с помощью Process.Start, которое было запущено без консольного окна и без использования shell execute :(ProcessStartInfo.CreateNoWindow = true; ProcessStartInfo.UseShellExecute = false;).

Предполагается, что запускаемое приложение будет "чисто" закрыто, если оно получит сигнал ctrl-c или ctrl-break, но, похоже, нет способа отправить его, который работает (в частности, GenerateConsoleCtrlEvent).

Process.Kill не работает. Это оставляет поврежденные файлы из-за резкого уничтожения процесса.Process.CloseMainWindow не работает. В этом случае нет главного окна, поэтому функция возвращает false и ничего не делает.Вызов EnumThreadWindows во всех потоках для процесса и отправка WM_CLOSE каждому окну ничего не делает, и в любом случае нет окон потоков.GenerateConsoleCtrlEvent не работает. Это полезно только для процессов в одной и той же группе (которую .NET не дает вам никакого контроля), с нежелательным побочным эффектом закрытия вызывающего процесса в любом случае. Функция не позволяет указывать идентификатор процесса.

Тот, кто может предоставить код, который принимает объект «Процесс», запущенный с указанными выше параметрами, что приводит к чистому завершению запущенного процесса без влияния на вызывающий процесс, будет отмечен как ответ. Используйте 7z.exe (архиватор 7-zip) в качестве примера консольного приложения, которое начинает сжимать большой файл и оставляет поврежденный, незаконченный файл позади, если не завершен без ошибок.

Пока кто-то не предоставит функциональный пример или код, который приведет к функциональному примеру, этот вопрос остается без ответа. Я видел десятки людей, задающих этот вопрос и десятки ответов онлайн, и ни один из них не работает. Похоже, что .NET не поддерживает чистое закрытие консольного приложения с учетом его идентификатора процесса, что странно, если учесть, что оно запущено с объектом .NET Process. Частично проблема заключается в невозможности создания процесса в новой группе процессов, что делает использование GenerateConsoleCtrlEvent бесполезным. Должно быть решение этого.

Ответы на вопрос(2)

Ваш ответ на вопрос