从cmd运行时控制台和winforms应用程序之间的区别

use*_*ame 4 c# cmd winforms

我有一个winforms应用程序,有时从命令行使用.这是代码(当然简化):

[STAThread]
static void Main()
{
    AttachConsole(ATTACH_PARENT_PROCESS);
    Console.WriteLine("Hello");

    /*Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());*/
}
Run Code Online (Sandbox Code Playgroud)

如果那是一个控制台应用程序,输出可能是:

C:\ConsoleApplication\ConsoleApplication.exe
Hello
C:\ConsoleApplication\_
Run Code Online (Sandbox Code Playgroud)

在Windows应用程序的情况下,它实际上:

C:\WindowsApplication\WindowsApplication.exe
C:\WindowsApplication\Hello
_
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我为什么我们有这样的差异,是否有可能使我的Windows应用程序在从cmd运行时表现得像控制台?

编辑:

我希望我的Windows应用程序在从cmd运行时表现得像控制台:

C:\WindowsApplication\WindowsApplication.exe
Hello
C:\WindowsApplication\_
Run Code Online (Sandbox Code Playgroud)

解:

结果我正在运行我的应用程序

C:\WindowsApplication\start /wait WindowsApplication.exe
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 9

是.区别在于cmd.exe知道可执行文件的类型.它知道等待进程在它是控制台模式应用程序时终止.它并没有当它是一个常规的Windows GUI应用程序等.相信它会创建自己的窗口.因此它再次显示命令提示符,您的输出将附加到该输出.你也有使用Console.ReadLine()顺便说一句的麻烦.

您必须启动程序start /wait yourapp.exe以强制cmd.exe等待.AllocConsole()相反,呼叫是唯一的通用修复.当您的应用程序从快捷方式启动时,还会负责创建控制台.

AllocConsole()相当迷惑.考虑编写一个小型的控制台模式应用程序,除了Process.Start + WaitForExit之外什么也不做,以启动你的主程序.也许还会修改命令行参数.现在你得到了阻止行为.如果你将可执行文件重命名为mainapp.com(以启动mainapp.exe),那么差异就会被隐藏得很好,这也是VS使用的技巧(devenv.exe vs devenv.com).