我创建了一个包含两个项目的程序:Windows UI和“引擎”。我想这样做,以便用户可以从命令提示符执行程序传入一些参数,引擎将自动执行它们并吐出结果。或者,用户可以启动UI并通过下拉列表等选择所有选项,然后单击按钮告诉引擎执行此操作。 我实际上已经使用了很久以前发现的东西,但是我试图看看是否有更简单的方法。我发现的方法包括添加一个Win32类并从kernel32.dll创建AllocConsole,FreeConsole和AttachConsole的外部。 有没有更简单的方法?感谢。
答案 0 :(得分:3)
这很简单,使你的Windows窗体应用程序和Main
方法检查命令行参数,以防你的参数在那里,而不是调用
Application.Run(new Form1());
只需致电您的引擎并开始处理。
正确编码引擎并在用户从用户界面启动这些命令时使用相同引擎的UI也很重要,这样可以避免任何无用的代码重复。
我们在许多程序中使用此方法,如果您不致电Application.Run(...)
,我们会感到满意,您的程序只会在Main
方法结束时终止。
答案 1 :(得分:1)
它甚至更简单。创建控制台应用程序。它将解析命令行以获取参数,然后调用您的引擎。
让WinForms应用程序担心GUI,让控制台应用程序担心命令行。
答案 2 :(得分: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>
[...]
特别注意:
控制台配置有<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文件名)。