Как прочитать консольный вывод процесса без перенаправления стандартного вывода? - PullRequest
0 голосов
/ 27 июня 2018

Я пишу графический интерфейс для стороннего консольного приложения, и я хотел, чтобы он захватывал выходные данные окна консоли и добавлял его в текстовое поле в графическом интерфейсе. Казалось, это было просто, все, что мне нужно было сделать, это перенаправить поток вывода целевого процесса.

Но, когда я это делаю, консольное приложение выдает ошибку:

CTextConsoleWin32 :: GetLine:! GetNumberOfConsoleInputEvents

Текущий код, который вызывает эту ошибку:

// This gets called once after the application has initialized.
private void StartServer()
{
    ProcessStartInfo processStartInfo = new ProcessStartInfo();
    processStartInfo.FileName = srcdsExeFile;
    processStartInfo.UseShellExecute = false;
    processStartInfo.CreateNoWindow = true;
    processStartInfo.RedirectStandardOutput = true;
    processStartInfo.RedirectStandardError = true;
    processStartInfo.RedirectStandardInput = true;

    serverProcess = Process.Start(processStartInfo);
    serverProcess.EnableRaisingEvents = true;
    serverProcess.Exited += new EventHandler(Server_Exited);
    serverProcess.OutputDataReceived += ServerProcess_OutputDataReceived;
    serverProcess.ErrorDataReceived += ServerProcess_ErrorDataReceived;
    serverProcess.BeginOutputReadLine();
    serverProcess.BeginErrorReadLine();
}

// This is (like seen above) an event handler for serverProcess.ErrorDataReceived.
private void ServerProcess_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
    Console.Output.WriteLine("\n\nServer Error: " + e.Data + "\n\n");
}

// This is (like seen above) an event handler for serverProcess.OutputDataReceived.
private void ServerProcess_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    Console.Output.WriteLine(e.Data);
}

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

После некоторого исследования выясняется, что стороннее консольное приложение полагается на выходной поток как на консоль, поэтому при попытке его перенаправить происходит сбой. Попытка получить доступ к выходному потоку без перенаправления также вызывает ошибку, говорящую, что я должен перенаправить его первым.

Что подводит меня к моему актуальному вопросу:
Можно ли прочитать вывод консольного приложения, не перенаправляя поток вывода?

...