CLI和GUI应用程序

4

我正在编写一个既有CLI又有GUI的应用程序。

我阅读了大多数关于此问题的问题和文章,并发现这个问题非常有用:

一个可执行文件可以同时是控制台和GUI应用吗?

我的最终代码如下:

        if (args.Length > 0)
        {
            //console code            
        }
        else
        {
            FreeConsole();
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form());
        } 

双击运行.exe、调试或带参数从控制台运行均可正常工作。

然而,如果在控制台没有带参数的情况下运行,GUI会打开,这正是我想要的,但控制台会停留在等待GUI关闭的状态。

这种GUI和控制台的行为不符合惯例。通常控制台启动GUI后就不会等待其退出,而是等待新命令。

是否有办法避免这种情况发生?

6个回答

1

你链接的问题中被接受的答案包含以下内容:

Junfeng 的第二种技术是 ildasm 使用的。他引用了 ildasm 作者在使其在两种模式下运行时经历的过程。最终,它所做的是:

该程序被标记为控制台模式二进制文件,因此它始终以控制台启动。这允许输入和输出重定向正常工作。如果程序没有控制台模式命令行参数,则重新启动自身。仅调用 FreeConsole 并不足以使第一个实例停止成为控制台程序。这是因为启动程序的进程 cmd.exe “知道” 它启动了一个控制台模式程序,并正在等待程序停止运行。调用 FreeConsole 会使 ildasm 停止使用控制台,但不会使父进程开始使用控制台。

对我来说,似乎让二进制文件尝试在控制台子系统和 GUI 子系统之间切换(这确实是不允许的)的麻烦比它值得的努力还要多。

一种方法是拥有一个单独的 GUI 应用程序 .exe。每当控制台应用程序在没有参数的情况下启动时,它会启动 GUI 应用程序并关闭自身。

为了防止代码重复,这可能需要将应用程序的所有实际逻辑放在一个单独的类库中。

1
通常的做法是将表现与逻辑分离,然后有两个可执行文件,一个是命令行界面(CLI),另一个是图形界面(GUI),而不是只有一个可以既是CLI也可以是GUI的可执行文件。这样做会导致某种糟糕的妥协,既没有CLI的优点,也没有GUI的优点。 具有命令行选项的GUI应用程序并不是CLI应用程序,而是带有不可见/短暂窗口的GUI应用程序。

0

编写能够在GUI/CLI/CUI/网络模式下工作的应用程序的最佳方法是使用libgreattao。

在sourceforge.net上搜索它。

Libgreattao将业务逻辑和通信机制分离,因此您可以在程序中的任何地方放置与libgreattao相关的代码。


0

也许这不是你直接问题的答案,但使用这种双重解决方案会带来麻烦 :) 这是一种在某些情况下有效的黑客方法,但在其他情况下则无效。

正确的解决方案应该是将功能和应用逻辑排除在单独的类库中,然后从控制台和 GUI 应用程序中调用该“引擎”。将所有这三个项目放在一个 Visual Studio 解决方案中。所有功能和绝大部分代码都应该在那个类库中,GUI 和控制台项目只需要处理依赖于环境的特定方面(例如,按钮单击事件仅在 GUI 应用程序中等)。


0

看起来没问题。您启动了一个命令,只有在应用程序停止时才返回。

如果您不想等待它返回,请在新线程中启动它。(ThreadPoolThreadTask、C#5.0 中的 async/await => 选择您喜欢的)。


我思考了一下并尝试了使用线程,并将其声明为IsBackground=false,但它没有起到任何改变的作用,仍然等待应用程序退出。 - sara

0

需要在控制台中启动GUI应用程序而不卡住控制台吗?请从命令提示符中键入:

start "[title not necessary for gui exe]" "full path to .exe"

请在这里查看


GUI应用程序无论如何都会立即返回。不需要使用“start”。这只有在控制台应用程序中才是必需的。 - Joey
启动命令可以防止CMD提示等待进程结束。 - Alberto De Caro
就像我说的那样,它无论如何都不会等待GUI应用程序。尝试使用“记事本”或类似的东西。 - Joey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接