I have a console application (Host.exe) that is written in Delphi.
I want to redirect the output of the console application in C# application (WinForm).
If I use the following, the (Host.exe) is invoked without problems, but it is not possible to get the output since it is run as (show-window, quite independent).
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);
}
}
However, if I try to capture the output (redirection), the process will exit immediately (HasExited = true, the loop breaks, the debugger shows, “Only part of a ReadProcessMemory or WriteProcessMemory request was completed”.
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);
}
}
I have googled a lot but haven’t got the solution.
the following pages present similar problems, and I’ve tried the suggested solutions but nothing works.
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
Thanks a lot… this wastes me a lot of time already.. I hope I can get a solution here.
EDIT: The problem still exists even I don’t use any ReadLine() or ReadToEnd() method. When ‘UseShellExecute’ set to false, the Host.exe will exit immediately.. The Host.exe is supposed to do some big computation (takes around 2 minutes and report progress through console WriteLine every few seconds).
I found out that the following lines will cause errors if you redirect the output in C#. I am using a Console.pas unit in Delphi that in Initialization of that unit, it invokes InitScreenMode procedure.
I am guessing ‘Reset’ or ‘Rewrite’ the Console stdin/stdout will cause problems when ‘UseShellExecute’ set to false in C#