【问题标题】:C# Command Line arguments problem in Release build发布版本中的 C# 命令行参数问题
【发布时间】:2009-04-08 02:43:50
【问题描述】:

我遇到了一个我自己无法解决的简单问题。我有一个 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 获取可执行文件,所以我无法更改。 这是一个已知问题吗?有没有办法解决这个问题?

【问题讨论】:

    标签: c# .net winforms


    【解决方案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% 一致的结果,获得“合并”参数的唯一方法是在命令行上将它们括在引号中(特别是为了让你确实有包含空格的参数,请参见下面的最后一个示例):

    PS C:\...\bin\Debug> .\ConsoleApplication1.exe 一二三 有 3 个参数 0:一 1:两个 2:三个 PS C:\...\bin\Debug> pushd ..\release PS C:\...\bin\Release> .\ConsoleApplication1.exe 一二三 有 3 个参数 0:一 1:两个 2:三个 PS C:\...\bin\Release> pushd ..\..\obj\debug PS C:\...\obj\Debug> .\ConsoleApplication1.exe 一二三 有 3 个参数 0:一 1:两个 2:三个 PS C:\...\obj\Debug> pushd ..\release PS C:\...\obj\Release> .\ConsoleApplication1.exe 一二三 有 3 个参数 0:一 1:两个 2:三个 PS C:\...\obj\Release> .\ConsoleApplication1.exe -file test.txt 有 2 个论据 0:-文件 1:测试.txt PS C:\...\obj\Release> .\ConsoleApplication1.exe "-file test.txt" 有 1 个参数 0:-文件 test.txt

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

    【讨论】:

    • 我的错,我是个白痴:-) 我刚刚注意到我的安装程序打开文件格式的命令是“-file {0}”,我所要做的就是删除引号...... .
    • 哎呀...容易做,很难发现...如果不直接执行,将添加一个注释来检查实际传递的内容。
    【解决方案2】:

    这适用于 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);
          }
        }
      }
    

    【讨论】:

    • 是否有充分的理由使用静态字符串而不是更改 ctor 的签名来获取参数?
    • 不,没有。为了简洁起见,我使用了静态字符串。如您所见,我将 Args 声明为公共字段。在真正的代码中,我永远不会那样做。在这种情况下,我们存储参数并不那么重要,我们正在解决另一种问题。
    【解决方案3】:

    【讨论】:

    • 谢谢!我会尝试这样做,但是,它需要对我的代码进行重大更改,因为第一个参数是程序的名称。似乎应该有办法解决发布版本的现有问题。
    • 试过了,还是不行:-( 自定义日志文件的输出:First Key=[-file C:\Temp\test.dpk] 参数数量:1 环境参数数量: 2 Args的数量就是args.Length,Env.Args的数量就是Environment.GetCommandLineArgs().Length
    【解决方案4】:

    您的问题(正如理查德在他的代码中指出的那样)是您在运行发布版本时的参数都包含在一组引号中。去掉引号就可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-23
      • 1970-01-01
      • 2011-02-12
      • 2015-10-17
      相关资源
      最近更新 更多