WinForm / Console混合应用程序中的行为

我有一个WinForm项目,如果将某些参数传递给它,我希望它可用作控制台应用程序。 使用我从这里读到的一些技巧,我使用以下代码来完成这项工作。

[System.Runtime.InteropServices.DllImport("kernel32.dll")] private static extern bool AllocConsole(); [System.Runtime.InteropServices.DllImport("kernel32.dll")] private static extern bool AttachConsole(int pid); ... if (!AttachConsole(-1)) { AllocConsole(); } 

这有效,但有一个恼人的副作用 – 所有输出似乎都是从后台线程生成的。 当我从命令提示符运行程序时,输出显示输出前的下一个提示。

我将项目属性的输出类型设置为控制台应用程序,它解决了这个问题,但现在总是显示一个控制台窗口 – 即使它在’WinForm模式’下运行。

有没有办法充分利用控制台行为的两个世界,程序是当前进程,当程序显示WinForm时,控制台窗口不显示?

更新:我很抱歉没有澄清这一点。 我在Program.cs中切换控制台和WinForm模式,如下所示:

 // nowin is a bool that is set based on a parameter if (nowin) { if (!AttachConsole(-1)) { AllocConsole(); } //... Console mode code here... } else { // run in window Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1(argDict)); } 

也许我一直在做错了,但我总是做这样的混合动力:

 [STAThread] public static int Main(string[] args) { if (args.Length > 0) { // run console code here } else { // start up the win form app Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); } return 0; } 

您可以通过创建winforms应用程序而不显示主窗体(如果在命令行上传递某个参数)来实现此操作,而不是这种iffy方法。

由于控制台应用程序不需要消息循环,因此在控制台模式下调用时不会调用Application.Run()。

所以你的Main()会是这样的:

  static void Main(params string[] args) { if (args.Length > 0 && args[0] == "consolemode") { // do stuff } else { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); } } 

我没试过,但我认为它会起作用。

看起来没有办法解决它:1)如果我希望控制台模式下的输出表现得像专用的控制台应用程序,控制台窗口必须始终存在。 2)如果我想在窗口模式下运行它时隐藏控制台,我将丢失阻止打印。

上面的方法是有效的,但如果您尝试调试exception,它将不允许您写入控制台,这令人抓狂。 要从Win Forms应用程序写入控制台,您需要应用此处描述的代码: http : //www.codeissue.com/issues/i24e1ef8e5a93b4/run-windows-form-application-as-console-app-c 。