#c# #winforms #console-application
Вопрос:
У меня есть консольное приложение C# , которое я пытаюсь выполнить из другого приложения WinForm, как и batch runner, предоставив файл .exe консольного приложения, как показано ниже.
Process.Start("Path of Console application exe to execute")
Однако мне нужно подождать, обработать вывод и отобразить вывод в richtextbox WinForm из консольного приложения, как только оно завершит выполнение. Как я могу этого достичь?
Обновить
Я изменил код для запуска процесса и чтения с использованием StandardOutput
и BeginOutputReadLine()
асинхронного чтения выходных данных, но не смог увидеть вывод в окне консоли, вместо этого окно консоли закрывается. Не знаю, как это решить.
p.StartInfo.UseShellExecute = false;
// p.StartInfo.CreateNoWindow = True
p.StartInfo.RedirectStandardOutput = true;
string @out = null;
p.StartInfo.RedirectStandardError = true;
p.OutputDataReceived = new DataReceivedEventHandler((sender, e) =>
{
@out = e.Data;
});
p.StartInfo.FileName = currentTest;
p.Start();
p.BeginOutputReadLine();
// string output = p.StandardError.ReadToEnd();
// p.WaitForExit()
while (!p.HasExited)
Application.DoEvents();
//Console.WriteLine($@"Output n'{output.Substring(output.Length - 50)}'");
Console.WriteLine($@"n Error stream: {@out}");
Console.ReadLine();
Комментарии:
1. У вас есть код этого консольного приложения?
2. Если вам нужен вывод, вам нужно перенаправить StdOut . Если вам нужно дождаться завершения процесса, вы можете это сделать .
3. Но если ответ на мой 1. вопрос «да», то, вероятно, лучше включить «бизнес-логику» в библиотеку и использовать ее вместо устаревших материалов.
4. @Fildor: Да, я владею как консольными, так и приложениями WinForm. Попробую ваши предложения, спасибо.
5. @Fildor: Я изменил свой код с помощью StdOut перенаправления, но по-прежнему ничего не вижу на консоли, вместо этого консоль закрывается при возникновении ошибки в консольном приложении. Как действовать дальше? И не могли бы вы дать мне краткий намек на «бизнес-логику», о которой вы говорили выше.
Ответ №1:
Вам нужно перенаправить stdout
(и, вероятно stderr
,), чтобы любой вывод приходил к вам вместо консоли; вы также можете захотеть перенаправить stdin
. Все эти вещи доступны через ProcessStartInfo
, с примером на MSDN. Обратите внимание, что если вы хотите отображать обновления во время работы exe — файла , вам может потребоваться рабочий поток для постепенного чтения из StandardOutput
и StandardError
, а не ReadToEnd()
-который вообще ничего не вернет, пока соответствующий выходной канал не будет закрыт.
Однако! Если исполняемый файл консоли «ваш», может быть проще просто предоставить необходимые функции в библиотеке и вызвать ее непосредственно в процессе. Бывают случаи, когда активно предпочитают процесс «вне процесса», например, когда вам нужно позволить этому процессу пойти катастрофически неправильно в некоторых сценариях, но обычно предпочтительнее процесс «в процессе», учитывая свободу действий.
Комментарии:
1. Марк: Я обновил свой ответ, используя
StandardOutput
иBeginOutputReadLine
. Но я не могу видеть вывод в консоли, вместо этого консоль закрывается посередине, когда в консольном приложении возникает ошибка. Что не так в моем коде? И не могли бы вы мне намекнуть на «в процессе», как вы сказали выше?