我目前正在为解释性编程语言编写一个小编辑器。当程序运行时,编辑器(用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);
}
我甚至不确定导致输出不被写入的原因。否则,程序完全按预期运行。有没有办法让标准输出仍然写入控制台,同时仍然读取标准错误?或者有更好的方法从解释器进程获取错误指示?感谢。
答案 0 :(得分: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
}
希望这有帮助。