表单模式下没有控制台 window 的混合 windows 表单和控制台应用程序

Hybrid windows forms and console app without console window in forms mode

我想创建一个完整的混合应用程序,既可以作为 Windows Forms 又可以作为 Console Application。当我不带参数或不在控制台中执行它时,我希望应用程序打开 GUI 并离开控制台,就像普通的 Windows Forms 应用程序在从控制台调用时所做的那样,但要响应用户并进行交互当一些参数被告知时,比如接受条款和条件或确认文件覆盖时,与他一起通过控制台。这可能吗?

P.S.: 我不介意在 运行 GUI 时有控制台输出,但我希望控制台在 运行 在 GUI 上时保持隐藏状态,而在没有 GUI 时运行 作为控制台。

注意

how to run a winform from console application? 中建议的解决方案(创建一个表单项目,然后更改为控制台)不适合我,因为当从资源管理器调用应用程序时,它会打开一个控制台 window。

WinForms 和 Console 应用程序之间的区别在于它们的编译方式略有不同(参见 question)。控制台应用程序在清单中具有以下标志:

.子系统 0x0003 // WINDOWS_CUI

WinForms 应用如下:

.子系统 0x0002 // WINDOWS_GUI

与此主题相关的问题很多。例如,请参阅此 one。 一般来说,据我所知,没有理想的解决方案,但有一些解决方案在一定程度上起作用。例如试试这个:

  1. 创建 WinForms 应用程序。
  2. site 中复制代码。
  3. 修改WinForms应用程序的Main方法,如下所示。

修改后的Main方法:

[STAThread]
private static void Main(string[] args)
{
   if (args.Length == 0)
   {
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new Form1());
   }
   else
   {
      AllocateConsole();
      Console.WriteLine("I'm a console application");
      //...
      FreeConsole();
   }
}

此解决方案的缺点是:

  1. 无法将输出从控制台应用程序重定向到文件。
  2. 如果从命令行启动控制台应用程序,则必须通过按键明确关闭。
  3. 另请阅读我在上面指出的文章中的备注和重要内容