我有一个用Delphi编写的控制台应用程序(Host.exe)。 我想在C#应用程序(WinForm)中重定向控制台应用程序的输出。
如果我使用以下内容,则会调用(Host.exe)而不会出现问题,但由于它是以(show-window,相当独立的方式)运行,因此无法获得输出。
ProcessStartInfo pp = new ProcessStartInfo();
pp.WorkingDirectory = Path.GetDirectoryName(Application.ExecutablePath);
pp.FileName = Path.Combine(pp.WorkingDirectory, "Host.exe");
pp.CreateNoWindow = false;
pp.WindowStyle = ProcessWindowStyle.Normal;
pp.UseShellExecute = true;
using (Process pProcess = Process.Start(pp))
{
while ((pProcess != null) && (!pProcess.HasExited))
{
Application.DoEvents();
Thread.Sleep(updatefreq);
}
}
但是,如果我尝试捕获输出(重定向),则进程将立即退出(HasExited = true,循环中断,调试器显示,“只有部分ReadProcessMemory或WriteProcessMemory请求已完成”。
ProcessStartInfo pp = new ProcessStartInfo();
pp.WorkingDirectory = Path.GetDirectoryName(Application.ExecutablePath);
pp.FileName = Path.Combine(pp.WorkingDirectory, "Host.exe");
pp.UseShellExecute = false;
pp.RedirectStandardOutput = true;
pp.RedirectStandardInput = true;
pp.RedirectStandardError = true;
pp.CreateNoWindow = true;
pp.WindowStyle = ProcessWindowStyle.Hidden;
StreamReader outputReader = null;
using (Process pProcess = Process.Start(pp))
{
if (pProcess != null)
{
//StreamWriter inputWriter = pProcess.StandardInput;
//StreamReader errorReader = pProcess.StandardError;
outputReader = pProcess.StandardOutput;
}
while ((pProcess != null) && (!pProcess.HasExited))
{
string ss = null;
if (outputReader != null)
{
ss = outputReader.ReadLine();
}
if ((ss != null) && (2 < ss.Length))
{
string[] s = ss.Split('|');
if (3 == s.Length)
{
float global;
//float.TryParse(s[0], out local);
float.TryParse(s[1], out global);
RadioTracer.SetCurrentMsg(s[2]);
RadioTracer.SetCurrentStep((int)global);
}
}
Application.DoEvents();
Thread.Sleep(updatefreq);
}
}
我已经google了很多但没有得到解决方案。 以下页面提出了类似的问题,我尝试了建议的解决方案,但没有任何作用。
http://go4answers.webhost4life.com/Example/redirectstandardinput-a-32-bit-114440.aspx
http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/4f946750-6c47-406c-810c-21a2b103b5c4
非常感谢...这已经浪费了我很多时间..我希望我能在这里找到解决方案。
编辑:即使我不使用任何ReadLine()或ReadToEnd()方法,问题仍然存在。当'UseShellExecute'设置为false时,Host.exe将立即退出.. Host.exe应该进行一些大的计算(大约需要2分钟,并且每隔几秒通过控制台WriteLine报告进度)。
答案 0 :(得分:1)
我发现如果在C#中重定向输出,以下行将导致错误。我在Delphi中使用Console.pas单元,在该单元的初始化中,它调用InitScreenMode过程。
Reset(Input);
Rewrite(Output);
StdIn := TTextRec(Input).Handle;
StdOut := TTextRec(Output).Handle;
我猜测'重置'或'重写'控制台stdin / stdout会在C#中将'UseShellExecute'设置为false时导致问题