【问题标题】:Both CLI and GUI applicationCLI 和 GUI 应用程序
【发布时间】:2012-03-29 18:30:36
【问题描述】:

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

有办法避免吗?

【问题讨论】:

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


    【解决方案1】:

    您链接到的问题中接受的答案包含以下段落:

    君峰的第二个技巧就是ildasm使用的。他引用了这个过程 ildasm 的作者在使其以两种模式运行时都经历过。 最终,这就是它的作用:

    程序被标记为控制台模式二进制文件,所以它总是启动 带控制台。这允许输入和输出重定向工作 像平常一样。如果程序没有控制台模式命令行参数, 它会重新启动。仅仅调用 FreeConsole 是不够的 使第一个实例不再是控制台程序。那是因为 启动程序 cmd.exe 的进程“知道”它已启动 控制台模式程序,正在等待程序停止运行。 调用 FreeConsole 会使 ildasm 停止使用控制台,但它 不会让父进程开始使用控制台。

    在我看来,让二进制文件尝试在控制台子系统和 GUI 子系统之间切换(这实际上是不允许的)令人头疼的事情比它的价值要多。

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

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

    【讨论】:

      【解决方案2】:

      也许不是您直接问题的答案,但是使用这种双重解决方案您是在自找麻烦 :) 这是一种在某些情况下可行的技巧,但在其他情况下则不行。

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

      【讨论】:

        【解决方案3】:

        执行此操作的通常方法是从逻辑中抽象出表示,然后有两个 exe,一个 CLI,一个 GUI,而不是一个都可以。沿着这条路走下去,你会在两种方法的好处之间做出某种可怕的妥协。 带有命令行选项的 GUI 不是 CLI 应用程序,它是一个带有不可见/短寿命窗口的 GUI。

        【讨论】:

          【解决方案4】:

          这看起来是正确的。您启动一个仅在应用程序停止时返回的命令。

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

          【讨论】:

          • 我想了想并尝试这样做,使用线程并用 IsBackground=false 声明它,但它没有改变任何东西,它仍然等待应用程序退出。
          【解决方案5】:

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

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

          here

          【讨论】:

          • GUI 应用程序无论如何都会立即返回。无需使用start。这仅对控制台应用程序是必需的。
          • start命令阻止cmd提示等待进程结束
          • 正如我所说,它无论如何都不会等待 GUI 应用程序。试试notepad 或类似的东西。
          【解决方案6】:

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

          在 sourceforge.net 上搜索它。

          Libgreattao 将业务逻辑和通信机制解耦,因此您可以在程序中随处放置 libgreattao 相关代码。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-01-26
            • 1970-01-01
            • 2018-05-20
            • 2017-06-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多