Запустите консольное приложение C# в приложении WinForms и дождитесь его завершения

#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 . Но я не могу видеть вывод в консоли, вместо этого консоль закрывается посередине, когда в консольном приложении возникает ошибка. Что не так в моем коде? И не могли бы вы мне намекнуть на «в процессе», как вы сказали выше?