在我的应用程序中包含命令行模式是一种好的实践吗?是否更好地拥有两个不同的程序,一个带有GUI,另一个带有命令行?
将C#应用程序既做控制台应用程序又做GUI应用程序是有问题的。控制台应用程序(/t:exe)启动后,命令提示符会等待它们完成。 GUI应用程序(/t:winexe)命令外壳启动它们然后立即返回。虽然您可以从“控制台”应用程序创建和运行表单,但它始终会显示一个背景控制台。另一方面,“窗体”应用程序没有连接stdin,stdout和stderr,尽管它们可以像命令行工具一样运行并处理命令参数,但在嵌入脚本时会出现问题(因为标准输入/输出未连接)。
如果要从基于GUI的应用程序和可脚本/可批处理处理功能中公开功能,则最好的方法是将功能编译成类库,然后构建两个分别利用该库的单独应用程序(一个GUI应用程序和一个控制台应用程序)。
是的。如果您认为该程序在脚本环境中会很有用,则包括一个命令行模式(无UI),以便可以在脚本中使用。
它不必是一个单独的应用程序,但可以是。是否要这样做完全取决于您。我想象一下,如果您有两个应用程序,它们将共享相同的逻辑程序集,但接口(一个GUI,另一个命令行)只是不同的。
我同意michaelsafyan的建议,应该创建一个拥有核心功能的库。
此外,我想补充的是您应该也要了解PowerShell cmdlets。
许多命令行活动将迁移到PowerShell上,并且它带来了很多优势。
我经常会创建一种叫做API的工具。如果我需要从一个简单的命令行工具中使用它,那很容易——只需调用API即可。如果命令行变得过于复杂,可能是时候使用Winforms应用程序了——它也可以调用API。如果我想要从PowerShell或MSBUILD任务中使用它,这些也很容易——只需调用API即可。
我同意@Remus Rusanu的观点。
你应该创建一个核心功能的类库,然后为其构建GUI应用程序(包装器)。
另一个好处是你甚至可能不需要创建命令行应用程序,因为你可以使用PowerShell访问你的.NET DLL功能。
你可以在这里找到一个例子。
另一个好主意是嵌入脚本语言。这样,您的程序可以由脚本控制,并且您可以从脚本语言中获得所有逻辑、分支等“免费”。
有许多选择可供嵌入。Lua 是最流行的之一,专门为此目的而设计,是一个绝佳的选择。
然而,对于通用应用程序,我会认真考虑嵌入 Python。Python 如此受欢迎,您将拥有更大的人群愿意为您的应用程序编写脚本。