Можно ли запустить процесс (используя С# Process.Start()
) в той же консоли, что и вызывающая программа? Таким образом, новое окно не будет создано, а стандартный ввод/вывод/ошибка будет такой же, как и приложение вызывающей консоли. Я попытался установить process.StartInfo.CreateNoWindow = true;
, но процесс все еще запускается в новом окне (и сразу же закрывается после его завершения).
Начать процесс в той же консоли
Ответ 1
Вам не нужно ничего делать, кроме набора UseShellExecute = false
, поскольку поведение по умолчанию для функции Win32 CreateProcess для консоли приложение, чтобы наследовать родительскую консоль, если вы не указали флаг CREATE_NEW_CONSOLE.
Я пробовал следующую программу:
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();
}
и он дал мне этот результат:
Ответ 2
Вы можете попробовать перенаправить вывод этого процесса, а затем распечатать его на консоли вызывающего процесса:
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());
}
}
Альтернативный подход с использованием события Exited
и дескриптора ожидания:
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());
}
}