Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Редиректнем stdout & stderr?

147  
Murr патриот08.09.17 18:05
Murr
08.09.17 18:05 

Редиректнем stdout & stderr?


Потребовалось мне снова несколько странное - запустить MsTest.ехе из другого приложения.

Ах, да - в шелле, но в режиме х64.

Результаты - тоже потребовались. Причем - как выход, так и ошибки.


Как делать запуск - описано ниже:

https://msdn.microsoft.com/en-us/library/system.diagnostic...


Порылся в архиве кодa и выкопал следующее, упрощенное решение:


private static string DoExecute(string exe, string arguments)

{

var psi = new ProcessStartInfo(exe, arguments);

psi.RedirectStandardError = true;

psi.RedirectStandardOutput = true;

psi.UseShellExecute = false;

var p = Process.Start(psi);

var sb = new StringBuilder();

p.BeginErrorReadLine();

p.BeginOutputReadLine();

p.OutputDataReceived += (sender, args) => sb.Append(args.Data);

p.ErrorDataReceived += (sender, args) => sb.Append(args.Data);

Assert.IsTrue(p.WaitForExit(BaseTest.EventWaitTimeout));

Assert.AreEqual(p.ExitCode, 0);

return sb.ToString();

}


И возникло у меня несколько пятничных вопросиков...


первые - p.BeginErrorReadLine(); p.BeginOutputReadLine(); - вроде понятно - переключают вывод сообщений...

но если посмотреть - процесс уже сформирован и запущен.

Насколько Я помню - доковырятся до ядра процесса для переназначения не слишком просто.

Еще моментик - процесс мог завершится до начала переназначения - винда ничего не гарантирует.

В общем - непонятно какого такого переназначение делается не в параметрах/свойствах до старта процесса.


вторые - по самому перехвату. Снова плохо воспринимаю назначение перехватчиков после запуска процесса.

Ведь можно нормальным образом создать Процесс. Спокойно все назначить и потом - запустить.

Даже ПСИ, если есть желание иметь его отдельно - можно без проблем формировать отдельно.

И все будет просто, логично и понятно. Почему делают такие непонятные сложности... и почему оно работает?


третье. Ну тут самое простое - поленились (может даже Я) вынести это дело в отдельный поток - сб к моменту

показа резултатов - пуста, нужно добавлять п.ваитфоеехит(); - что затормозит прожку... ну да не проблема...

Опсс... Это точно Я пропустил - в оригинале есть вызов - спрятан в аргументах Ассерта...


#1 
AlexNek патриот28.09.17 20:39
AlexNek
NEW 28.09.17 20:39 
в ответ Murr 08.09.17 18:05
p.BeginErrorReadLine(); p.BeginOutputReadLine(); - вроде понятно - переключают вывод сообщений..

https://msdn.microsoft.com/en-us/library/system.diagnostic...


psi.RedirectStandardError = true;

psi.RedirectStandardOutput = true;


и почему оно работает?

просто повезло. Мне как то подобное понадобилось. На экране все нормально, а при перехвате полнейшая ерунда получалась.

#2