Это выглядит как невозможная задача. Абсолютно ничего, что я нашел, работает. Вопрос заключается в том, как полностью закрыть консольное приложение, запущенное с Process.Start, которое было запущено без консольного окна и без использования оболочки: (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 бесполезным. Должно быть решение этого.