如何在C#的Main函数之外访问命令行参数

23

我正在编写一个.NET类,需要解析进程的命令行。我不想让Main()方法和该类之间产生依赖关系。该类如何访问命令行?

我正在编写一个.NET类,需要解析进程的命令行。我不想让Main()方法和该类之间产生依赖关系。该类如何访问命令行?
5个回答

45

调用 Environment.GetCommandLineArgs()


2
GetCommandLineArgs存在严重缺陷。请避免使用。请广泛传播此信息。 - Victor Zakharov

5
如果您使用.NET Compact Framework,则Environment.GetCommandLineArgs()方法未实现,System.Diagnostics.Process.GetCurrentProcess().StartInfo.Arguments始终返回空字符串,因此必须使用主函数并将参数传递给其他类。
例如:
[MTAThread]
static void Main(String[] commandLineArguments)
{
  CommandLineHelper.parse(commandLineArguments);
}

public static class CommandLineHelper
{
  public static void parse(String[] commandLineArguments) {
    // add your code here
  }
}

感谢提供 Compact Framework 的建议。在我的情况下,我不想在指定参数时显示主窗体,这样该 exe 就会以静默模式运行,但是如你所建议的,您可以将那些参数存储在静态类中,该类可用于应用程序的所有窗体。这适用于任何框架。对于那些感兴趣的人,这是我的代码。 [MTAThread] static void Main(String[] cmd) { if (cmd.Length == 0) Application.Run(new frmMain()); else MessageBox.Show(cmd[0]); } - kuklei

2

String[] myStr = Environment.GetCommandLineArgs();

这行代码获取命令行参数的字符串数组。

最好完整地展示示例。


1
System.Diagnostics.Process.GetCurrentProcess().StartInfo.Arguments

实际上,这似乎不起作用。它似乎总是为空的。请参阅https://dev59.com/NkXRa4cB1Zd3GeqPv_AH - Carsten

1
创建一个类来保存你的应用程序选项。在主方法中创建该类的实例,使用命令行参数初始化它,并将其传递给需要使用的类。
或者,您可以通过使用 Environment.GetCommandLineArgs() 调用 CustomConfigClass.Create() 方法,在任何时间之后初始化该类。
第一种选择是我的建议,因为它使该类更容易准备进行单元测试,并且可以在以后切换到另一种配置方法时,不会因为依赖于命令行而导致应用程序出现故障。

第一种选项仍然需要主方法知道其他类的存在,因此它并没有解决我的问题。我正在使用一个IOC容器,因此我将创建一个服务来公开GetCommandLineArgs功能,并使我的其他服务依赖于它。谢谢。 - Antoine Aubry
1
这略微偏离了我的观点。如果你正在使用IoC,那么不要有一个服务来返回命令行参数,而是要有一个服务接口来返回配置,并使用一个从命令行获取配置的类来实现它。这样你就可以用另一个类来进行单元测试。 - Neil Barnwell

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