CLI和GUI应用程序

时间:2012-03-13 10:54:10

标签: c# user-interface console-application command-line-interface

我正在编写一个同时具有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而不是等待退出,而是等待新的命令。

有没有办法避免它?

3 个答案:

答案 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相关的代码。