【问题标题】:C#; Redirecting Process standard error but not its standard outputC#;重定向进程标准错误而不是其标准输出
【发布时间】:2011-03-02 20:24:54
【问题描述】:

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

}

我什至不确定是什么导致输出不被写入。否则,程序的行为完全符合预期。有没有办法让标准输出仍然写入控制台,同时仍然读取标准错误?

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

【问题讨论】:

    标签: c# redirect process


    【解决方案1】:

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

    希望这会有所帮助。

    【讨论】:

    • 不错的主意。但是,每次用户按下编辑器中的“停止”和“运行”按钮时,我都无法关闭或重新打开控制台......我想要一个新的控制台可见每次解释程序运行时,当解释程序未运行时,没有控制台可见。此外,如果用户关闭输出控制台,编辑器也会关闭,这是有问题的。
    • 好的,我以为您想在编辑器内的窗口中显示解释器的输出。但现在我明白了,你想在控制台中运行,你只需要读出错误。我从来没有用过这种方式。但也许值得尝试使用异步流阅读器读取输出,例如。看看shake.codeplex.com/SourceControl/changeset/view/…,最后有一个过时的方法。
    • 是的,我应该更清楚。程序的输出应该显示在控制台中,但错误应该重定向到编辑器。
    猜你喜欢
    • 2022-12-14
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 2014-03-22
    • 1970-01-01
    • 2012-09-17
    相关资源
    最近更新 更多