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());
}
}