C#; 重定向过程标准错误,但不是标准输出

Geo*_*off 4 c# redirect process

我正在为一个解释性编程语言编写一个小编辑器.当程序运行时,编辑器(用C#编写)创建一个触发解释器的新进程(用C++编写).控制台看起来像任何其他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);

}
Run Code Online (Sandbox Code Playgroud)

我甚至不确定是什么导致输出不被写入.否则,程序完全按预期运行.有没有办法让标准输出仍然写入控制台,同时仍然读取标准错误?或者有更好的方法从解释器进程获取错误指示?谢谢.

Kal*_*ier 6

我认为,如果您对两个事件(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
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.