VS 2017 C# WinForms项目中Console.Write(string)失效原因咨询
Console.Write/WriteLine在WinForms应用中无输出的解决办法
嘿,我之前也踩过这个坑!在Visual Studio 2017的C# Windows Forms项目里用Console.Write或Console.WriteLine没反应,其实这不是Bug,是WinForms项目的默认行为导致的~
为啥会没输出?
Windows Forms项目默认的输出类型是「Windows应用程序」,这种类型的程序运行时不会自动创建控制台窗口,Console类的输出没有对应的显示载体,所以你看不到任何内容。
几种可行的解决方案:
修改项目输出类型(最简单)
右键你的WinForms项目 → 选择「属性」→ 切换到「应用程序」标签页 → 把「输出类型」改成「控制台应用程序」。这样运行程序时,会同时弹出WinForms窗口和一个控制台窗口,你的Console输出就会正常显示在控制台里了。重定向Console输出到WinForms控件
如果不想额外弹出控制台窗口,可以把Console的输出流重定向到比如TextBox这类控件里,代码示例:using System.IO; using System.Windows.Forms; private void Form1_Load(object sender, EventArgs e) { // 创建一个StringWriter来捕获Console输出 StringWriter consoleOutput = new StringWriter(); Console.SetOut(consoleOutput); // 测试输出 Console.WriteLine("Results: "); const int count = 15; for (int i = 0; i < count; i++) { if (i == (count - 1)) Console.Write(i); else Console.Write(i + ", "); } // 把捕获的内容显示到TextBox textBox1.Multiline = true; textBox1.Text = consoleOutput.ToString(); }手动创建控制台窗口(用Win32 API)
如果你想保留WinForms的输出类型,又临时需要控制台窗口来查看输出,可以调用Win32的AllocConsole函数手动创建控制台,代码示例:using System.Runtime.InteropServices; using System.Windows.Forms; public partial class Form1 : Form { // 导入Win32 API [DllImport("kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool AllocConsole(); public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // 创建控制台窗口 AllocConsole(); // 现在Console输出就能显示在新弹出的控制台里了 Console.WriteLine("Results: "); const int count = 15; for (int i = 0; i < count; i++) { if (i == (count - 1)) Console.Write(i); else Console.Write(i + ", "); } } }
微软团队没给出有效协助可能是因为这不属于Bug,是WinForms项目的设计默认行为,你可以试试上面的方法解决问题~
内容的提问来源于stack exchange,提问作者Aaron Chapman
相关产品推荐
相关产品推荐

