C #; Стандартная ошибка перенаправления процесса, но не его стандартный вывод - PullRequest
4 голосов
/ 02 марта 2011

В настоящее время я пишу небольшой редактор для интерпретируемого языка программирования.Когда программа запускается, редактор (написанный на C #) создает новый процесс, который запускает интерпретатор (написанный на C ++).Консоль отображается так же, как и в любой другой программе на С ++, и показывает ее вывод.

Когда интерпретатор (т. Е. Программа на С ++) сталкивается с ошибкой в ​​коде, сообщение печатается со стандартной ошибкой,с указанием типа ошибки и номера строки, на которой она произошла.Я хотел бы прочитать стандартную ошибку интерпретатора из редактора, чтобы редактор мог выделить строку ошибки, как указано в сообщении об ошибке.

К сожалению, приведенный ниже код (предназначен для чтения только стандартная ошибка), как-то приводит к тому, что стандартный вывод программы также не выводится на консоль!

private void indicateErrorTest(object sendingProcess, DataReceivedEventArgs outLine)
{
    MessageBox.Show(outLine.Data);
}

private void run()
{

    program = new Process();
    program.StartInfo.FileName = INTERPRETER_PATH;
    program.StartInfo.Arguments = "\"" + relativeFilename + "\"";

    program.StartInfo.RedirectStandardError = true;
    program.StartInfo.UseShellExecute = false;

    program.ErrorDataReceived += new DataReceivedEventHandler(indicateErrorTest);
    program.Start();

    program.BeginErrorReadLine();

    program.EnableRaisingEvents = true;
    program.Exited += new System.EventHandler(onProgramConsoleClose);

}

Я даже не уверен, что приводит к тому, что вывод не записывается.В противном случае программа ведет себя полностью, как ожидалось.Есть ли способ заставить стандартный вывод по-прежнему записывать в консоль, при этом читая стандартную ошибку?Или есть лучший способ получить индикации ошибок от процесса интерпретатора?Благодаря.

1 Ответ

6 голосов
/ 02 марта 2011

Я считаю, что вы можете достичь того, что вам нравится, если вы подпишетесь на оба события (OutputDataReceived и ErrorDataReceived), а затем просто запишите стандартный вывод в консоль, например:

_process.OutputDataReceived += Process_OutputDataReceived;
_process.ErrorDataReceived += Process_ErrorDataReceived;

void Process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    Console.WriteLine(e.Data);
}

void Process_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
    // do your stuff
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...