我应该在我的应用程序中包含命令行模式吗?

5
为了学习目的,我正在使用c#和winforms开发一个类生成应用程序。我认为包含一个命令行模式可以让用户在脚本中使用。
在我的应用程序中包含命令行模式是一种好的实践吗?是否更好地拥有两个不同的程序,一个带有GUI,另一个带有命令行?
10个回答

9

将C#应用程序既做控制台应用程序又做GUI应用程序是有问题的。控制台应用程序(/t:exe)启动后,命令提示符会等待它们完成。 GUI应用程序(/t:winexe)命令外壳启动它们然后立即返回。虽然您可以从“控制台”应用程序创建和运行表单,但它始终会显示一个背景控制台。另一方面,“窗体”应用程序没有连接stdin,stdout和stderr,尽管它们可以像命令行工具一样运行并处理命令参数,但在嵌入脚本时会出现问题(因为标准输入/输出未连接)。

如果要从基于GUI的应用程序和可脚本/可批处理处理功能中公开功能,则最好的方法是将功能编译成类库,然后构建两个分别利用该库的单独应用程序(一个GUI应用程序和一个控制台应用程序)。


您还可以使用一些win32-api工具(AllocConsole/AttachConsole)在winexe应用程序中创建控制台输出窗口,但这仍然存在一些问题,因为它没有指定正确的子系统。 - Jasper Bekkers
@Jasper:当然,我认为你甚至可以追求索引为0、1和2的FCB,但我真的建议你远离那个,顺应潮流而不是逆流而上。 ;) - Remus Rusanu
我从未有过编写同时运行GUI和命令行的应用程序的需求,我从未意识到这是如此棘手的问题。非常有启发性的回答。 - Chris Marisic
什么?你是在说分配控制台本来就过时了吗?FCB已经过时了。非常非常过时。自从MSDOS v2(它有文件句柄)以来,就一直如此。 - sehe

5
我虽然不是C#程序员,但在使用C++编程时,我发现以下做法最为实用:
1.) 创建一个带有C和C++ API的共享库,用于执行应用程序的核心功能。
2.) 创建一个或多个可通过shell解释器访问的命令行二进制文件。
3.) 创建一个GUI应用程序,供普通终端用户使用,该应用程序使用库(而非调用二进制文件)实现。
这样可以将应用程序的逻辑与应用程序的接口分离,并使第三方开发人员可以为同一应用程序功能创建替代界面。它也很容易编写脚本,同时还适合那些想要漂亮、华丽GUI的典型终端用户。

2

是的。如果您认为该程序在脚本环境中会很有用,则包括一个命令行模式(无UI),以便可以在脚本中使用。

它不必是一个单独的应用程序,但可以是。是否要这样做完全取决于您。我想象一下,如果您有两个应用程序,它们将共享相同的逻辑程序集,但接口(一个GUI,另一个命令行)只是不同的。


2

我同意michaelsafyan的建议,应该创建一个拥有核心功能的库。

此外,我想补充的是您应该也要了解PowerShell cmdlets。

许多命令行活动将迁移到PowerShell上,并且它带来了很多优势。

http://en.wikipedia.org/wiki/Windows_PowerShell


2

我经常会创建一种叫做API的工具。如果我需要从一个简单的命令行工具中使用它,那很容易——只需调用API即可。如果命令行变得过于复杂,可能是时候使用Winforms应用程序了——它也可以调用API。如果我想要从PowerShell或MSBUILD任务中使用它,这些也很容易——只需调用API即可。


1
在Windows平台上创建一个行为正确的控制台应用程序可能会有问题,这是由于Windows内核架构的问题,因为它们被认为是两种不同类型的应用程序(通常在编译器或链接器选项中指定不同的子系统)。您仍然可以通过Win32函数AllocConsole()和相关函数手动重定向IO并打开控制台,但这也存在一些问题。请参见This Old New Thing post以获取更多信息。

1
如果您想让您的实用程序/程序在脚本中运行,可以将其公开为COM对象。
许多Windows脚本语言都可以直接使用COM对象。

1
如果命令行界面可以增强可用性和舒适度,那么你应该在应用程序中包含一个命令行界面。例如,调用CLI命令可能比启动GUI并浏览几个菜单层来达到相同的功能要快得多。你可以问你的应用程序用户,他们是否认为有CLI模式会有用。
关于在Windows上结合CLI和GUI的一些话: Windows应用程序是GUI应用程序或控制台应用程序,但不是两者兼备。这是一个操作系统问题,可能无法解决。Windows中的控制台子系统很糟糕,PowerShell也没有改变这一点。
在Windows上的实现选项有:
- 两个文件的方法: 提供两个文件:一个带控制台的.com文件,一个带GUI的.exe文件。由于命令行上的可执行探测,com文件将在exe文件之前被执行。
- 控制台闪烁的方法: 以控制台模式编译GUI应用程序,然后在GUI启动后立即调用FreeConsole()关闭它。这有点烦人,但有效。缺点是:现在你有一个闪烁的控制台窗口。优点是:仍然只有一个文件。

0

我同意@Remus Rusanu的观点。

你应该创建一个核心功能的类库,然后为其构建GUI应用程序(包装器)。

另一个好处是你甚至可能不需要创建命令行应用程序,因为你可以使用PowerShell访问你的.NET DLL功能。

你可以在这里找到一个例子。


0

另一个好主意是嵌入脚本语言。这样,您的程序可以由脚本控制,并且您可以从脚本语言中获得所有逻辑、分支等“免费”。

有许多选择可供嵌入。Lua 是最流行的之一,专门为此目的而设计,是一个绝佳的选择。

然而,对于通用应用程序,我会认真考虑嵌入 Python。Python 如此受欢迎,您将拥有更大的人群愿意为您的应用程序编写脚本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接