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

C#;重定向进程标准错误,但不重定向其标准输出,c#,redirect,process,C#,Redirect,Process,我目前正在为解释式编程语言编写一个小编辑器。当程序运行时,编辑器(用C#编写)会创建一个新进程来触发解释器(用C++编写)。控制台看起来像任何其他C++程序一样,显示程序的输出。 当解释器(即C++程序)在代码中遇到错误时,将消息打印到标准错误,指示其发生的错误类型和行号。我想做的是从编辑器中读取解释器的标准错误,这样编辑器就可以突出显示错误行,如错误消息中所示 不幸的是,下面的代码(设计为只读标准错误)以某种方式导致程序的标准输出也无法打印到控制台 private void indicateE

我目前正在为解释式编程语言编写一个小编辑器。当程序运行时,编辑器(用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);

}
我甚至不确定是什么原因导致输出无法写入。否则,程序将完全按照预期运行。有没有办法使标准输出仍然写入控制台,同时仍然读取标准错误


或者有更好的方法从解释器过程中获取错误指示吗?

我认为,如果您同时对两个事件(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
}

希望这能有所帮助。

这主意不错。但是,我无法在用户每次按下编辑器中的“停止”和“运行”按钮时关闭或重新打开控制台……我希望在每次解释程序运行时都能看到一个新的控制台,而在解释程序未运行时则看不到任何控制台。另外,如果用户关闭输出控制台,编辑器也会关闭,这是有问题的。但现在我明白了,您希望在控制台中运行,只需要读取错误。我从来没有这样用过。例如,也许值得尝试使用异步流读取器读取输出。看一看,结尾有一个obsolote方法。是的,我应该更清楚。程序的输出应显示在控制台中,但错误应重定向到编辑器。