发布版本中的C#命令行参数问题

时间:2009-04-08 02:43:50

标签: c# .net winforms

我有一个似乎是一个我无法解决的简单问题。我有一个WinForm应用程序,修改了main方法以接受命令行参数,如下所示:

    [STAThread]
    static void Main(String[] args)
    {
        int argCount = args.Length;
    }

当在调试模式下使用以下执行行编译时,此代码正常工作并且argCount等于2:program.exe -file test.txt。 但是,只要我在发布模式下编译程序,argCount现在为1,具有相同的命令行参数。唯一的参数包含“-file test.txt”。更重要的是,只有当我从obj / Release文件夹运行已编译的可执行文件时才会发生,而不是从bin / Release运行。不幸的是,安装项目从obj / Release获取可执行文件,所以我无法改变它。 这是一个已知的问题,是否有办法解决这个问题?

4 个答案:

答案 0 :(得分:1)

命令行处理应该是相同的,因此还会发生其他事情。当我尝试这个时:

class Program {
    [STAThread]
    static void Main(String[] args) {
        Console.WriteLine("Have {0} arguments", args.Length);
        for (int i = 0; i < args.Length; ++i) {
            Console.WriteLine("{0}: {1}", i, args[i]);
        }
    }
}

然后从各个位置获得100%一致的结果,获取参数“merged”的唯一方法是将它们用命令行中的引号括起来(具体是允许你有包含空格的参数) ,见下面的最后一个例子):

PS C:\...\bin\Debug> .\ConsoleApplication1.exe one two three
Have 3 arguments
0: one
1: two
2: three
PS C:\...\bin\Debug> pushd ..\release
PS C:\...\bin\Release> .\ConsoleApplication1.exe one two three
Have 3 arguments
0: one
1: two
2: three
PS C:\...\bin\Release> pushd ..\..\obj\debug
PS C:\...\obj\Debug> .\ConsoleApplication1.exe one two three
Have 3 arguments
0: one
1: two
2: three
PS C:\...\obj\Debug> pushd ..\release
PS C:\...\obj\Release> .\ConsoleApplication1.exe one two three
Have 3 arguments
0: one
1: two
2: three
PS C:\...\obj\Release> .\ConsoleApplication1.exe -file test.txt
Have 2 arguments
0: -file
1: test.txt
PS C:\...\obj\Release> .\ConsoleApplication1.exe "-file test.txt"
Have 1 arguments
0: -file test.txt

附加从命令提示符启动时,可以轻松查看正在传递的内容,因此很难检查其他应用程序何时启动您的应用程序。但是Process Explorer之类的工具会显示用于启动程序的命令行(双击进程并查看图像选项卡)。

答案 1 :(得分:1)

这适用于bin / Debug,bin / Release,obj / Debug和obj / Release:

static class Program {
  /// <summary>
  /// The main entry point for the application.
  /// </summary>
  [STAThread]
  static void Main(string[] args) {
    FormMain.Args = args;

    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new FormMain());
  }
}

  public partial class FormMain: Form {
    public static string[] Args;

    public FormMain() {
      InitializeComponent();
    }

    private void FormMain_Shown(object sender, EventArgs e) {
      foreach (string s in Args) {
        MessageBox.Show(s);
      }
    }
  }

答案 2 :(得分:0)

您是否尝试过Environment.GetCommandLineArgs()

答案 3 :(得分:0)

您的问题(正如Richard在其代码中指出的那样)是您运行发布版本时的参数都包含在一组引号中。删除引号,它将起作用。