我试图异步获取.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#代码中以任何方式解决这个问题吗?