Процесс RedirectStandardOutput пуст, а DataReceivedEventArgs.Data имеет значение null.
При запуске приложения в режиме консоли в консоль записываются строки.
Теперь я хочу сделать это программно. Вот пример кода, который я использовал: MSDN для события OutputDataReceived
private static StringBuilder _sortOutput = null;
var proc = new Process();
var info = new ProcessStartInfo();
info.FileName = @"C:\SomeApp.exe";
info.UseShellExecute = false;
info.WindowStyle = ProcessWindowStyle.Normal;
info.CreateNoWindow = false;
proc.StartInfo = info;
info.RedirectStandardOutput = true;
info.RedirectStandardError = true;
proc.OutputDataReceived += HandleOutputData;
proc.ErrorDataReceived += HandleOutputData;
proc.Start();
proc.BeginOutputReadLine();
proc.BeginErrorReadLine();
proc.WaitForExit();
var exitCode = proc.ExitCode;
var output = _sortOutput.ToString();
private void HandleOutputData(object sender, DataReceivedEventArgs e)
{
_sortOutput.Append(e.Data);
}
Но DataReceivedEventArgs.Data всегда имеет значение null, и я не возвращаю результат, который я вижу в открывшемся окне консоли.
Как я могу получить вывод? Есть ли способ достичь этого?
ОБНОВИТЬ
Я также пытался прочитать proc.StandardOutput
напрямую, но это не дает никаких данных.
3 ответа
Это ноль, потому что вы читаете данные в var outPut
Попробуйте следующее:
а) Изменить способ обращения с ним
proc.OutputDataReceived += new DataReceivedEventHandler(HandleOutputData);
б) Закомментируйте строку
//var outPut = proc.StandardOutput.ReadToEnd();
Как кто-то еще заметил, есть ошибка, где _sortOutput
будет нулевым Но независимо от этого, вы совершенно правы: e.Data
может и будет нулевым!
Фактически, ваш обработчик всегда должен вызываться с e.Data
равно нулю, когда AsyncStreamReader, который выполняет вызов, достигает EOF стандартного перенаправляемого вывода - что произойдет, когда завершится запущенный вами процесс. Если, конечно, вы сначала не отменили регистрацию обработчика события OutputDataReceived или отменили асинхронное перенаправление вывода.
Нуль означает конец асинхронного потока. Вы должны и WaitForExit, и дождаться завершения завершающего нуля через e.Data