¿Cómo cerrar de forma limpia una aplicación de consola iniciada con Process.Start?

Esto parece una tarea imposible. Absolutamente nada de lo que he encontrado funciona. La pregunta es cómo cerrar limpiamente una aplicación de consola iniciada con Process.Start que se haya iniciado sin la ventana de la consola y sin usar shell execute: (ProcessStartInfo.CreateNoWindow = true; ProcessStartInfo.UseShellExecute = false;).

Se da que la aplicación que se está iniciando se cerrará "limpiamente" si recibe una señal ctrl-c o ctrl-break, pero parece que no hay manera de enviar una que funcione (en particular, GenerateConsoleCtrlEvent).

Proceso. La matanza no funciona. Deja archivos corruptos detrás debido a la muerte abrupta del proceso.Process.CloseMainWindow no funciona. No hay ventana principal en este caso, por lo que la función devuelve falso y no hace nada.Llamar a EnumThreadWindows en todos los subprocesos para el proceso y enviar un WM_CLOSE a cada ventana no hace nada, y de todos modos no hay ninguna ventana de subproceso.GenerateConsoleCtrlEvent no funciona. Solo es útil para procesos en el mismo grupo (en los que .NET no le da control), con un efecto secundario no deseado de cerrar el proceso de llamada de todos modos. La función no le permite especificar un ID de proceso.

Quienquiera que pueda proporcionar un código que acepte un objeto "Proceso" iniciado con los parámetros que se encuentran arriba, que se traduce en un cierre limpio del proceso iniciado sin afectar el proceso de llamada, se marcará como la respuesta. Use 7z.exe (7-zip archiver) como una aplicación de consola de ejemplo, que comienza a comprimir un archivo grande, y dejará un archivo corrupto sin terminar si no se finaliza de forma limpia.

Hasta que alguien proporcione un ejemplo funcional o un código que lleve a un ejemplo funcional, esta pregunta no tiene respuesta. He visto a docenas de personas hacer esta pregunta y docenas de respuestas en línea, y ninguna de ellas funciona. Parece que .NET no proporciona soporte para cerrar de forma limpia una aplicación de consola dado su id de proceso, lo cual es extraño considerando que se inició con un objeto de proceso .NET. Parte del problema es la incapacidad de crear un proceso en un nuevo grupo de procesos, lo que hace que el uso de GenerateConsoleCtrlEvent sea inútil. Tiene que haber una solución a esto.

Respuestas a la pregunta(2)

Su respuesta a la pregunta