在单独的程序中将控制台输出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) )); }
- 迭代器和枚举器之间的区别
- C#中Task.FromResult <TResult>的用法是什么
- 回发或callback参数无效。 事件validation使用'<pages enableEventValidation =“true”/>'
- 如何在不使用Microsoft.Office.Interop.Excel库的情况下读取C#中的excel文件
- SqlParameter已经被另一个SqlParameterCollection包含了 – 是否使用(){}作弊?
- 如果我在使用声明结束之前返回,会发生什么情况? 这个configuration会被调用吗?
- 将文件path转换为文件URI?
- 如何在IIS 7应用程序池中设置.net Framework 4.5版本
- 无法添加System.Web.dll引用