在单独的程序中将控制台输出redirect到文本框

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

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

控制台程序并不意味着停止运行,直到我的应用程序停止并且文本随机更改。 我试图做的只是从控制台钩输出触发事件处理程序,然后可以用来更新文本框。

我正在使用C#编写程序并使用.NET框架进行开发。 原来的应用程序不是一个.NET程序。

编辑:这是我想要做的示例代码。 在我最后的应用程序中,我将用代码replaceConsole.WriteLine来更新文本框。 我试图在我的事件处理程序中设置一个断点,甚至没有达到。

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); } 

这适用于我:

 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 } 

您可以使用下面的代码

  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(); 

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

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

感谢Marc Maxham为他节省了我的时间!

正如所有交易的Jon注意到的那样,为了redirectIOstream,UseShellExecute必须设置为false,否则Start()调用会引发InvalidOperationExceptionexception。

这里是我对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) )); }