visual studio start example ejemplos c# process console

studio - system.diagnostics.process c# example



Iniciar un proceso en la misma consola. (2)

¿Puedo iniciar un proceso (utilizando C # Process.Start() ) en la misma consola que el programa de llamada? De esta manera, no se creará una nueva ventana y la entrada / salida / error estándar será la misma que la aplicación de la consola de llamadas. Intenté establecer process.StartInfo.CreateNoWindow = true; pero el proceso aún comienza en una nueva ventana (y se cierra inmediatamente después de que finaliza).


No debería tener que hacer nada más que establecer UseShellExecute = false , ya que el comportamiento predeterminado para la función Win32 CreateProcess es que una aplicación de consola herede su consola principal, a menos que especifique el indicador CREATE_NEW_CONSOLE .

Probé el siguiente programa:

private static void Main() { Console.WriteLine( "Hello" ); var p = new Process(); p.StartInfo = new ProcessStartInfo( @"c:/windows/system32/netstat.exe", "-n" ) { UseShellExecute = false }; p.Start(); p.WaitForExit(); Console.WriteLine( "World" ); Console.ReadLine(); }

y me dio esta salida:


Puede intentar redirigir la salida de este proceso y luego imprimirlo en la consola del proceso de llamada:

public class Program { static void Main() { var psi = new ProcessStartInfo { FileName = @"c:/windows/system32/netstat.exe", Arguments = "-n", RedirectStandardOutput = true, UseShellExecute = false }; var process = Process.Start(psi); while (!process.HasExited) { Thread.Sleep(100); } Console.WriteLine(process.StandardOutput.ReadToEnd()); } }

Enfoque alternativo utilizando el evento Exited y un controlador de espera:

static void Main() { using (Process p = new Process()) { p.StartInfo = new ProcessStartInfo { FileName = @"netstat.exe", Arguments = "-n", RedirectStandardOutput = true, UseShellExecute = false }; p.EnableRaisingEvents = true; using (ManualResetEvent mre = new ManualResetEvent(false)) { p.Exited += (s, e) => mre.Set(); p.Start(); mre.WaitOne(); } Console.WriteLine(p.StandardOutput.ReadToEnd()); } }