将控制台输出重定向到单独程序中的文本框

我正在开发一个Windows Forms应用程序,该应用程序要求我调用一个单独的程序来执行任务。 该程序是一个控制台应用程序,我需要将标准输出从控制台重定向到程序中的TextBox。

我从我的应用程序执行程序没有问题,但是我不知道如何将输出重定向到我的应用程序。 我需要在使用事件运行程序时捕获输出。

在我的应用程序停止并且文本以随机间隔不断变化之前,控制台程序并不打算停止运行。 我试图做的只是从控制台挂接输出以触发事件处理程序,然后可以使用该事件处理程序来更新TextBox。

我正在使用C#编写程序代码,并使用.NET框架进行开发。 原始应用程序不是.NET程序。

编辑:这是我正在尝试执行的示例代码。 在我的最终应用程序中,我将用代码替换Console.WriteLine来更新TextBox。 我试图在事件处理程序中设置一个断点,但是甚至没有达到。

    void Method()
    {
        var p = new Process();
        var path = @"C:\ConsoleApp.exe";

        p.StartInfo.FileName = path;
        p.StartInfo.UseShellExecute = false;
        p.OutputDataReceived += p_OutputDataReceived;

        p.Start();
    }

    static void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
    {
        Console.WriteLine(">>> {0}", e.Data);
    }
John Saunders asked 2020-02-13T06:56:30Z
5个解决方案
70 votes

这对我有用:

void RunWithRedirect(string cmdPath)
{
    var proc = new Process();
    proc.StartInfo.FileName = cmdPath;

    // set up output redirection
    proc.StartInfo.RedirectStandardOutput = true;
    proc.StartInfo.RedirectStandardError = true;    
    proc.EnableRaisingEvents = true;
    proc.StartInfo.CreateNoWindow = true;
    // see below for output handler
    proc.ErrorDataReceived += proc_DataReceived;
    proc.OutputDataReceived += proc_DataReceived;

    proc.Start();

    proc.BeginErrorReadLine();
    proc.BeginOutputReadLine();

    proc.WaitForExit();
}

void proc_DataReceived(object sender, DataReceivedEventArgs e)
{
    // output will be in string e.Data
}
Mark Maxham answered 2020-02-13T06:56:46Z
4 votes

您可以使用以下代码

        MemoryStream mem = new MemoryStream(1000);
        StreamWriter writer = new StreamWriter(mem);
        Console.SetOut(writer);

        Assembly assembly = Assembly.LoadFrom(@"C:\ConsoleApp.exe");
        assembly.EntryPoint.Invoke(null, null);
        writer.Close();

        string s = Encoding.Default.GetString(mem.ToArray());
        mem.Close();
Ahmed Said answered 2020-02-13T06:57:06Z
1 votes

我在O2平台(开放源代码项目)中添加了许多辅助方法,这些方法可让您通过控制台输出和输入轻松编写与另一个进程的交互的脚本(请参阅[http://code.google.com/p/o2platform /source/browse/trunk/O2_Scripts/APIs/Windows/CmdExe/CmdExeAPI.cs)]

可能允许您查看API的API(允许在现有控件或弹出窗口中查看当前进程的控制台输出)也可能对您有用。 有关更多详细信息,请参见此博客文章:[http://o2platform.wordpress.com/2011/11/26/api_consoleout-cs-inprocess-capture-of-the-console-output/](此博客还包含有关如何 消耗新进程的控制台输出)

Dinis Cruz answered 2020-02-13T06:57:31Z
1 votes

请参阅如何从C#运行.EXE文件并从DOS窗口获取(管道)结果回到C#

Sophie Alpert answered 2020-02-13T06:57:52Z
0 votes

感谢Marc Maxham的回答,这为我节省了时间!

正如所有行业的乔恩(Jon of All Trades)所注意到的那样,必须将txtOut设置为false才能重定向IO流,否则Start()调用将抛出InvalidOperationException

这是我对代码的修改,其中txtOut是WPF只读文本框

void RunWithRedirect(string cmdargs)
{
    var proc = new Process()
    {
        StartInfo = new ProcessStartInfo("cmd.exe", "/k " + cmdargs)
        {
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            CreateNoWindow = true
        },
        EnableRaisingEvents = true
    };

    // see below for output handler
    proc.ErrorDataReceived += proc_DataReceived;
    proc.OutputDataReceived += proc_DataReceived;
    proc.Start();

    proc.BeginErrorReadLine();
    proc.BeginOutputReadLine();

    proc.WaitForExit();
}

void proc_DataReceived(object sender, DataReceivedEventArgs e)
{
    if (e.Data != null)
        Dispatcher.BeginInvoke(new Action( () => txtOut.Text += (Environment.NewLine + e.Data) ));
}
LauLo answered 2020-02-13T06:58:21Z
translate from https://stackoverflow.com:/questions/415620/redirect-console-output-to-textbox-in-separate-program