如何创建也可以在命令提示符下运行的Windows窗体程序

时间:2011-10-16 18:43:48

标签: c# winforms command-line-arguments

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

3 个答案:

答案 0 :(得分:3)

这很简单,使你的Windows窗体应用程序和Main方法检查命令行参数,以防你的参数在那里,而不是调用

Application.Run(new Form1());

只需致电您的引擎并开始处理。

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

我们在许多程序中使用此方法,如果您不致电Application.Run(...),我们会感到满意,您的程序只会在Main方法结束时终止。

答案 1 :(得分:1)

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

让WinForms应用程序担心GUI,让控制台应用程序担心命令行。

答案 2 :(得分:1)

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

DebugConsole, DebugGui, ReleaseConsole, ReleaseGui

以上截图适用于解决方案配置。您必须对项目再次执行相同操作(在上面的屏幕截图中,具有这四种配置的项目是临检)。以下摘自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>
[...]

特别注意:

  • 控制台配置有<OutputType>Exe</OutputType>(这使得它们成为控制台应用),而版本配置有<OutputType>WinExe</OutputType>

  • 两种控制台配置都定义了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文件名)。