Como encerrar de forma limpa um aplicativo de console iniciado com Process.Start?

Isto está parecendo uma tarefa impossível. Absolutamente nada que eu encontrei funciona. A questão é como fechar de maneira limpa um aplicativo de console iniciado com o Process.Start que foi iniciado sem nenhuma janela do console e sem usar o shell execute: (ProcessStartInfo.CreateNoWindow = true; ProcessStartInfo.UseShellExecute = false;).

É dado que o aplicativo que está sendo iniciado será encerrado "limpo" se receber um sinal de ctrl-c ou ctrl-break, mas parece não haver nenhuma maneira de enviar um que funcione (particularmente GenerateConsoleCtrlEvent).

Process.Kill não funciona. Deixa arquivos corruptos para trás devido à morte abrupta do processo.Process.CloseMainWindow não funciona. Não há janela principal neste caso, portanto a função retorna false e não faz nada.Chamar EnumThreadWindows em todos os segmentos para o processo e enviar um WM_CLOSE para cada janela não faz nada e não há janelas de thread de qualquer maneira.GenerateConsoleCtrlEvent não funciona. É útil somente para processos no mesmo grupo (que o .NET não lhe dá controle), com um efeito colateral indesejado de fechar o processo de chamada de qualquer maneira. A função não permite que você especifique um id de processo.

Quem puder fornecer código que aceite um objeto "Process" iniciado com os parâmetros acima, o que resulta em um desligamento limpo do processo iniciado, sem afetar o processo de chamada, será marcado como a resposta. Use o 7z.exe (7-zip archiver) como um aplicativo de console de exemplo, que começa a compactar um arquivo grande e deixa um arquivo corrompido e inacabado para trás se não for terminado de forma limpa.

Até que alguém forneça um exemplo funcional ou código que leve a um exemplo funcional, essa questão não é respondida. Já vi dezenas de pessoas fazendo essa pergunta e dezenas de respostas on-line, e nenhuma delas funciona. O .NET parece não oferecer suporte para o fechamento de um aplicativo de console, dado seu id de processo, o que é estranho considerando que ele foi iniciado com um objeto .NET Process. Parte do problema é a incapacidade de criar um processo em um novo grupo de processos, o que torna o uso do GenerateConsoleCtrlEvent inútil. Tem que haver uma solução para isso.

questionAnswers(2)

yourAnswerToTheQuestion