【问题标题】:Is it a bad idea to combine a GUI program and a console application into a single EXE?将 GUI 程序和控制台应用程序组合成一个 EXE 是不是一个坏主意?
【发布时间】:2013-07-02 19:53:57
【问题描述】:

我正在编写一个基于 WPF 界面的小实用程序。我还希望能够通过执行带有命令行参数的程序来自动执行该实用程序执行的相同任务。将这两个任务合并到一个程序中是不是一个坏主意?我拥有我的工具在单独的共享库中执行的实际逻辑和功能。所以如果它们是分开的,我就不会复制一大堆代码。

我想在我的 App.cs 文件中做这样的事情

private void Application_Startup(object sender, StartupEventArgs e)
    {
        if (e.Args.Length > 1)
        {
            //Go do automated tasks
        }
        else
        {
            //open GUI

            Window window = new Window();

            this.MainWindow = window;

            window.Show();
        }
    }

【问题讨论】:

  • 有些应用程序已经这样做了一段时间......为什么这是一个坏主意?如果您需要锤子,请使用锤子。
  • 一个问题是,如果 GUI 支持在启动时绑定(而不是基于完全动态反射),那么您将限制控制台应用程序可以运行的位置。你也可能会放慢速度。 .net/wpf 可能不是一个大问题,但在其他情况下可能是一个问题。
  • 你总是可以遵循 Visual Studio 使用的 hack :) 有两个可执行文件:一个用于 GUI,一个用于控制台。控制台可执行文件获得 .com 扩展名(尽管是 PE),因为 .com 优先于 .exe(在默认 PATHEXT 中)。因此,如果你从 cmd.exe 执行它,你会得到控制台版本,如果你运行 .exe,你会得到一个 GUI。

标签: c# .net wpf console-application


【解决方案1】:

您实际上并没有创建控制台,因此这不是控制台模式应用程序。

接受参数的 GUI 程序是完全正常的。样板示例是file association。就像在 Windows 资源管理器中双击 .sln 文件一样,会启动 Visual Studio,然后加载解决方案。双击位图启动 MS-Paint。等等。单击的文件的路径通过命令行参数传递给程序,就像您在命令解释器中键入一样。

是否创建窗口完全取决于您。不要忘记报告问题的必要性。

【讨论】:

    【解决方案2】:

    在这种情况下,我将创建一个从不同主机项目调用的功能类库。 MyApp.WPF 将 MyLib 引用为 dll...MyApp.Console 将 MyLib 引用为 dll。

    edit 我看到您已经有了功能分离的类库。那么将其保留在同一个应用程序中的真正好处是什么?

    【讨论】:

      【解决方案3】:

      您绝对可以这样做来运行自动化任务或从命令行设置选项,但请记住,WPF 应用程序没有控制台窗口,因此您将无法使用Console.WriteLine() 或类似的东西。如果您不需要控制台输出,也许这没什么大不了的。

      将控制台窗口附加到 WPF 应用程序可能会有一些可怕的 win32 hack,但我不建议这样做。如果您需要一个真正的控制台,那么为您的库构建 WPF 和控制台前端可能是可行的方法。

      我还建议 Options.cs 在 C# 中进行命令行参数处理。

      编辑:我可能对这一切都错了,请参阅 cmets。

      另外:有关 Windows 应用程序与控制台应用程序的相关信息:Difference between Windows and Console application

      【讨论】:

      • 向 WPF 应用程序添加控制台窗口很容易。创建项目后,只需转到项目属性并将“Start As”更改为“Console Application”。然后,您将获得一个控制台,以及您的主窗口或其他任何东西。
      • @Steve - 有趣,我认为你不能这样做是有原因的,但它似乎对我来说很好。
      • 我从来没有深入研究过它,但我确实在某台 PC 上运行时遇到了应用程序失败,我使用控制台窗口来帮助解决它。只需将选项更改回来即可再次将其关闭。 :)
      • 像这样的双 GUI/控制台模式的一个缺点是,当您在 GUI 模式下运行时,它仍然会生成控制台,除非您在启动时添加代码来抑制它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-11
      • 2021-04-18
      • 2011-09-27
      • 1970-01-01
      • 2011-12-24
      • 2010-11-03
      相关资源
      最近更新 更多