gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:08:30 26 4
gpt4 key购买 nike

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

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

/*Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());*/
}

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

C:\ConsoleApplication\ConsoleApplication.exe
Hello
C:\ConsoleApplication\_

对于 Windows 应用程序,它实际上是:

C:\WindowsApplication\WindowsApplication.exe
C:\WindowsApplication\Hello
_

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

编辑:

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

C:\WindowsApplication\WindowsApplication.exe
Hello
C:\WindowsApplication\_

解决方法:

因此,我正在运行我的应用程序

C:\WindowsApplication\start /wait WindowsApplication.exe

最佳答案

是的。不同之处在于 cmd.exe 知道可执行文件的种类。当它是控制台模式应用程序时,它知道等待进程终止。当它是常规 Windows 图形用户界面应用程序时,它不会等待。相信它会创建自己的窗口。所以它再次显示命令提示符,你的输出被附加到它上面。您还会在使用 Console.ReadLine() 时遇到麻烦。

您必须使用 start/wait yourapp.exe 启动您的程序以强制 cmd.exe 等待。调用 AllocConsole() 是唯一的通用修复方法。还负责在您的应用从快捷方式启动时创建控制台。

AllocConsole() 相当令人迷惑。考虑编写一个小型控制台模式应用程序,它只执行 Process.Start + WaitForExit 来启动您的主程序。也许还修改命令行参数。现在您恢复了阻塞行为。如果您将可执行文件重命名为 mainapp.com(以启动 mainapp.exe),那么差异就会被很好地隐藏起来,这是 VS 也使用的一个技巧(devenv.exe vs devenv.com)。

关于c# - 从 cmd 运行时控制台和 winforms 应用程序之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7613880/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com