【问题标题】:Winform app command line arguments IndexOutOfRangeExceptionWinform 应用程序命令行参数 IndexOutOfRangeException
【发布时间】:2016-06-17 14:01:07
【问题描述】:

我有一个 winform 应用程序,我将参数“1-2-c:\temp-test”放入项目属性的调试选项卡下的命令行参数文本框中。阅读代码如下。

String[] arguments = Environment.GetCommandLineArgs();

string exeFilename = arguments[0]; 
string temp = arguments[1]; // return the argument string value. e.g."1-2-c:\temp-test" 



string[] args = temp.Split('-');
  try
        {
            string first = "", second="", third="", fourth = "";
            if (args != null && args.Count() > 0)
            {
                first = string.IsNullOrEmpty(args[0]) ? "1" : args[0];
                second = string.IsNullOrEmpty(args[1]) ? "2" : args[1];
                third = string.IsNullOrEmpty(args[2]) ? @"c:\temp\" : args[2];
                fourth = string.IsNullOrEmpty(args[3]) ? "test" : args[3];



            }
catch(Exception ex)
        {
            string argsTest  = "";
            if (!string.IsNullOrEmpty(args[0]))
                argsTest = args[0];
            if (!string.IsNullOrEmpty(args[1]))
                argsTest = argsTest + " "+ args[1];
            if (!string.IsNullOrEmpty(args[2]))
                argsTest = argsTest + " " + args[2];
            if (!string.IsNullOrEmpty(args[3]))
                argsTest = argsTest + " " + args[3];


            MessageBox.Show(argsTest + " \n Error:  " + ex.ToString());
        }

当我从 Visual Studio 运行应用程序时,它工作正常,但是当我转到 bin\debug 并双击 .exe 文件时,我得到了 IndexOutOfRangeException 异常。

另一个观察,如果我使用命令提示符的参数执行这个 exe,它可以正常工作。

双击我的 exe 文件时引发异常。

我搜索并花时间解决,但没有得到任何解决方案。我完全被困住了。任何类型的提示/代码/建议都是可观的。

【问题讨论】:

标签: c# winforms


【解决方案1】:

当您通过 .exe 文件打开它时,您没有提供任何参数。确保在打开 .exe 时使用某种方法提供参数(从命令提示符或硬编码某些内容以进行测试)。

【讨论】:

  • 当然,在访问第二个参数之前添加一个检查!!!最好使用“未提供参数,退出”消息优雅地退出。
【解决方案2】:

如果您需要从可执行文件运行,您必须传入命令行参数。这可以通过以下两种常见方式之一完成:

  1. 创建一个批处理文件,使用合适的参数调用可执行文件。
  2. 创建快捷方式并修改 Target 以将参数放在末尾。

另外,您可能应该检查您的参数是否已提供。即

if (arguments.Length >= 2)

【讨论】:

    【解决方案3】:

    在 Visual Studio 中设置调试命令不会将它们“嵌入”到 exe 文件中。这仅意味着 Visual Studio 将在启动 exe 进行调试时传递这些参数。

    双击exe会有效传递no参数,也就是说这个指令:

    string exeFilename = arguments[0]; 
    

    将生成您看到的异常。

    一个快速的解决方案是在继续之前测试参数的数量:

    if(arguments.Lenght >= 4){
        //...do stuff...
    }
    

    【讨论】:

    • 这根本不是解决方案,解决方案是正确检查并实际传递参数
    • 是的,我没有注意到他仍在访问 catch 块中的数组(糟糕!)。编辑了我的答案。
    • 感谢大家的快速回复。这段代码只是测试代码。解决方案和建议工作正常。
    【解决方案4】:

    当您想要处理特定索引处的项目时,您应该检查args.Length,而不是string.IsNullOrEmpty(args[...])

    ...
    String first = (args.Length > 0) ? args[0] : "1";
    String second = (args.Length > 1) ? args[1] : "2";
    String third = (args.Length > 2) ? args[2] : @"c:\temp\";
    String fourth = (args.Length > 3) ? args[3] : "test";
    
    ...
    

    【讨论】:

      猜你喜欢
      • 2015-03-04
      • 2013-11-26
      • 2019-07-20
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      • 2011-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多