我正在编写一个同时具有CLI和GUI的应用程序。
我阅读了大部分关于它的问题和文章,并发现这个问题非常有用:
Can one executable be both a console and GUI application?
我的最终代码如下:
if (args.Length > 0)
{
//console code
}
else
{
FreeConsole();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form());
}
通过双击,调试或从带参数的控制台运行.exe时,这非常有用。
但是,当从没有参数的控制台运行它时,GUI会像我预期的那样打开,但控制台仍然等待GUI关闭。
这是一种不典型的GUI和控制台行为。控制台通常启动GUI而不是等待退出,而是等待新的命令。
有没有办法避免它?
答案 0 :(得分:0)
您链接的问题中接受的答案包含以下内容:
Junfeng的第二种技术是ildasm使用的技术。他引用了这个过程 ildasm的作者在两种模式下运行时都经历过。 最终,这就是它的作用:程序被标记为控制台模式二进制文件,因此它始终启动 用控制台出来。这允许输入和输出重定向工作 像平常一样。如果程序没有控制台模式命令行参数, 它重新启动自己。简单地调用FreeConsole是不够的 使第一个实例不再是一个控制台程序。那是因为 启动程序的进程cmd.exe“知道”它启动了 一个控制台模式程序,正在等待程序停止运行。 调用FreeConsole会使ildasm停止使用控制台,但它 不会让父进程开始使用控制台。
对我而言,让二进制文件试图在控制台子系统和GUI子系统之间切换(实际上是不允许的)的麻烦似乎比它的价值更多。
一种方法是使用单独的GUI应用程序.exe。每当启动控制台应用程序而没有参数时,它就会启动GUI应用程序并自行关闭。
为防止代码重复,这可能需要将应用程序的所有实际逻辑放在单独的类库中。
答案 1 :(得分:0)
需要从控制台启动一个gui应用程序而不会卡住控制台吗?从命令提示符下键入:
start "[title not necessary for gui exe]" "full path to .exe"
请参阅here
答案 2 :(得分:0)
在GUI / CLI / CUI /网络模式下编写应用程序的最佳方法是使用libgreattao。
在sourceforge.net上搜索。
Libgreattao将业务逻辑和通信机制分离,因此您可以在程序中的任何位置放置与libgreattao相关的代码。