我有一个用 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);
}
}
我用谷歌搜索了很多,但没有得到解决方案。以下页面出现了类似的问题,我已经尝试了建议的解决方案,但没有任何效果。
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 报告进度)。