Sending input/getting output from a console application (C#/WinForms)

c#, processstartinfo, redirectstandardoutput

Solution

If you want something interactive, I got this code to work (yours modified, details on modifications below)

    private void InitializeInterpreter()
    {
        InterProc.StartInfo.UseShellExecute = false;
        InterProc.StartInfo.FileName = "Echoer.exe";
        InterProc.StartInfo.RedirectStandardInput = true;
        InterProc.StartInfo.RedirectStandardOutput = true;
        InterProc.StartInfo.RedirectStandardError = true;
        InterProc.StartInfo.CreateNoWindow = true;
        InterProc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        InterProc.OutputDataReceived += new DataReceivedEventHandler(InterProcOutputHandler);

        bool started = InterProc.Start();

        InterProc.BeginOutputReadLine();

    }

    private void AppendTextInBox(TextBox box, string text)
    {
        if (this.InvokeRequired)
        {
            this.Invoke((Action<TextBox, string>)AppendTextInBox, OutputTextBox, text);
        }
        else
        {
            box.Text += text;
        }
    }

    private void InterProcOutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
    {
        AppendTextInBox(OutputTextBox, outLine.Data + Environment.NewLine);
    }

    private void Enterbutton_Click(object sender, EventArgs e)
    {
        InterProc.StandardInput.WriteLine(CommandTextBox.Text);
    }

So, I moved the BeginOutputReadLine to just after the process is started. That ensures it's really only called once. I also did an invoke required to clean up thread calls. Hopefully this should work for you.

Problem

I have a form with 3 controls: - A textbox for the user to enter commands to send to a console application, - A button to confirm the commands to be sent and - A read-only textbox to display the output from the application. What I want is for the user to enter commands in the first textbox, press the button to enter and receive feedback via the second textbox. I know how to use `ProcessStartInfo.RedirectStandardOutput` but, however, the app hangs when I use `StandardOutput.ReadToEnd()`. I had a look at the asynchronous `Process.BeginOutputReadLine()` but, even though my app does not hang, somehow I get no response in the textbox, it does absolutely nothing. Here's my code: ``` public partial class MainForm : Form { private void MainForm_Load(object sender, EventArgs e) { InitializeInterpreter(); } private void InitializeInterpreter() { InterProc.StartInfo.UseShellExecute = false; InterProc.StartInfo.FileName = "app.exe"; InterProc.StartInfo.RedirectStandardInput = true; InterProc.StartInfo.RedirectStandardOutput = true; InterProc.StartInfo.RedirectStandardError = true; InterProc.StartInfo.CreateNoWindow = true; InterProc.OutputDataReceived += new DataReceivedEventHandler(InterProcOutputHandler); InterProc.Start(); } private static void InterProcOutputHandler(object sendingProcess, DataReceivedEventArgs outLine) { if (!String.IsNullOrEmpty(outLine.Data)) { OutputTextBox.Append(Environment.NewLine + outLine.Data); } } private void Enterbutton_Click(object sender, EventArgs e) { InterProc.StandardInput.Write(CommandtextBox.Text); InterProc.BeginOutputReadLine(); } } ``` Is there any way I can have this run smoothly? Thanks.

Original source