在C#中强制c ++可执行文件的stdoutput缓冲区在遇到换行符时刷新

时间:2015-06-24 11:07:28

标签: c# c++ .net

我试图异步获取.exe文件的标准输出,我从C#程序开始,但从未调用DataReceivedEventHandler。

我的C#代码:

using System;  
using System.Diagnostics;
namespace ExeRunner
{
    class Program
    {

        static void Main(string[] args)
        {

            Process exeProcess;
            exeProcess = new Process();
            exeProcess.OutputDataReceived += new DataReceivedEventHandler(process_DataReceived);
            exeProcess.StartInfo.FileName = "<Path of exe file>";
            exeProcess.StartInfo.UseShellExecute = false;
            exeProcess.StartInfo.RedirectStandardOutput = true;
            exeProcess.Start();
            exeProcess.BeginOutputReadLine();
            exeProcess.WaitForExit(); //Alternatively leaving this out.
        }
        static public void process_DataReceived(object sender, DataReceivedEventArgs e)
        {
            Console.WriteLine(e.Data);
        }
    }
}

调试时我从未真正接受过process_DataReceived方法的调用。

我必须读取的.exe文件是一个c ++程序,它使用方法printf写入控制台,并且永远不会退出。我可以使用以下c ++源代码构建的可执行文件重新创建错误:

#include "stdafx.h"
#include "Windows.h" 
#include <iostream>
int main(int argc, _TCHAR* argv[])
{
    //setvbuf(stdout, NULL,_IOLBF,1024);
    printf("x=%s\n", "sometext");
    std::cout << "test\n";
    printf("3453%s\n", "moretext");
    printf("x=sd : %s\n", "evenmoretext");
    //fflush(stdout);
    Sleep(10000000);
    printf("next test");
    return 0;
}

如果我在fflush中发表评论或使用setvbuf将缓冲区设置为0,一切正常。所以问题似乎是stdout的缓冲区没有刷新换行符。至少不是重定向StandardOutput。

问题是,我无法更改实际的c ++程序,我必须阅读其可执行文件。

在我的C#代码中:是否有可能将c ++可执行文件的stdout缓冲区设置为0,或者在遇到新行后强制它刷新?

如果没有,我仍然可以在C#代码中以任何方式解决这个问题吗?

0 个答案:

没有答案