【问题标题】:How to create a Windows Forms program that can also run at the command prompt如何创建一个也可以在命令提示符下运行的 Windows 窗体程序
【发布时间】:2011-12-08 20:16:45
【问题描述】:

我创建了一个包含两个项目的程序:一个 Windows UI 和一个“引擎”。我想这样做,以便用户可以从传递一些参数的命令提示符执行程序,引擎将自动执行它们并吐出结果。或者用户可以启动 UI 并通过下拉列表等选择所有选项,然后单击一个按钮来告诉引擎完成它的工作。 实际上,我已经使用我很久以前发现的东西让它工作了,但我正在尝试看看是否有更简单的方法。我发现的方法包括添加一个 Win32 类并从 kernel32.dll 创建 AllocConsole、FreeConsole 和 AttachConsole 的外部。 有没有更简单的方法?谢谢。

【问题讨论】:

标签: c# winforms command-line-arguments


【解决方案1】:

创建四个单独的配置,两个用于 GUI,两个用于控制台:

上面的屏幕截图是针对解决方案配置的。您必须对 项目再次执行相同的操作(在上面的屏幕截图中,具有这四种配置的项目是临检)。这是Rummage.csproj的摘录:

[...]
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DebugGui|AnyCPU' ">
    <OutputType>WinExe</OutputType>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseGui|AnyCPU' ">
    <OutputType>WinExe</OutputType>
    <Optimize>true</Optimize>
    <DefineConstants>TRACE</DefineConstants>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugConsole|AnyCPU'">
    <OutputType>Exe</OutputType>
    <DefineConstants>DEBUG;TRACE;CONSOLE</DefineConstants>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseConsole|AnyCPU'">
    <OutputType>Exe</OutputType>
    <DefineConstants>TRACE;CONSOLE</DefineConstants>
    <Optimize>true</Optimize>
  </PropertyGroup>
[...]

特别注意:

  • 控制台配置有&lt;OutputType&gt;Exe&lt;/OutputType&gt;(这使它们成为控制台应用程序),而发布配置有&lt;OutputType&gt;WinExe&lt;/OutputType&gt;

  • 两种控制台配置都定义了CONSOLE 常量。这样您就可以使用#if CONSOLE [...] #else [...] #endif 来获得特定于控制台/GUI 的代码。例如,Main 方法可能如下所示:

    [STAThread]
    static int Main(string[] args)
    {
        #if CONSOLE
            return MainConsole(args);
        #else
            return MainGui(args);
        #endif
    }
    

    ...然后你可以在MainGui 中拥有WinForms 的东西,在MainConsole 中拥有命令行解析的东西。

通过这种方式,您可以在 Visual Studio 中运行(和调试)GUI 或控制台版本,而在构建脚本中,您可以简单地构建所有这些(并构建到不同的目录或不同的 EXE 文件名)。

【讨论】:

    【解决方案2】:

    它甚至更简单。创建控制台应用程序。它会解析命令行来获取参数,然后调用你的引擎。

    让 WinForms 应用程序操心 GUI,让 Console 应用程序操心命令行。

    【讨论】:

      【解决方案3】:

      很简单,创建你的 windows 窗体应用程序并在 Main 方法中检查命令行参数,如果你的参数在那里,而不是调用

      Application.Run(new Form1());
      

      只需调用您的引擎并开始处理。

      当用户从用户界面启动这些命令时,正确编码引擎并让 UI 使用相同的引擎非常重要,以避免任何无用的代码重复。

      我们在许多程序中使用这种方法,我们很满意,如果您不调用Application.Run(...),您的程序将在Main 方法结束时终止。

      【讨论】:

      • 不是那么简单——要么应用程序被标记为 GUI 应用程序并且没有创建控制台,所以你需要使用 AllocConsole 等,或者你将它标记为控制台应用程序,它会一直创建一个控制台窗口。问题出在控制台部分,而不仅仅是不显示 UI。
      • shf301,你提出的问题可能是我前段时间做这个的时候遇到的,但是,Davide,听起来这个方法对你有用,对吧?您将应用标记为 GUI 应用还是控制台应用?
      猜你喜欢
      • 2011-05-23
      • 2020-06-13
      • 1970-01-01
      • 1970-01-01
      • 2019-01-11
      • 1970-01-01
      • 2014-12-18
      • 2012-08-11
      • 1970-01-01
      相关资源
      最近更新 更多