Редиректнем stdout & stderr?
Редиректнем 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(); - вроде понятно - переключают вывод сообщений...
но если посмотреть - процесс уже сформирован и запущен.
Насколько Я помню - доковырятся до ядра процесса для переназначения не слишком просто.
Еще моментик - процесс мог завершится до начала переназначения - винда ничего не гарантирует.
В общем - непонятно какого такого переназначение делается не в параметрах/свойствах до старта процесса.
вторые - по самому перехвату. Снова плохо воспринимаю назначение перехватчиков после запуска процесса.
Ведь можно нормальным образом создать Процесс. Спокойно все назначить и потом - запустить.
Даже ПСИ, если есть желание иметь его отдельно - можно без проблем формировать отдельно.
И все будет просто, логично и понятно. Почему делают такие непонятные сложности... и почему оно работает?
третье. Ну тут самое простое - поленились (может даже Я) вынести это дело в отдельный поток - сб к моменту
показа резултатов - пуста, нужно добавлять п.ваитфоеехит(); - что затормозит прожку... ну да не проблема...
Опсс... Это точно Я пропустил - в оригинале есть вызов - спрятан в аргументах Ассерта...
p.BeginErrorReadLine(); p.BeginOutputReadLine(); - вроде понятно - переключают вывод сообщений..
https://msdn.microsoft.com/en-us/library/system.diagnostic...
psi.RedirectStandardError = true;
psi.RedirectStandardOutput = true;
и почему оно работает?
просто повезло. Мне как то подобное понадобилось. На экране все нормально, а при перехвате полнейшая ерунда получалась.