是否可以在调试时更改命令行参数?

时间:2012-08-13 08:57:28

标签: c# visual-studio-2010 debugging visual-studio-debugging

我创建了一个方法,根据传递的命令行参数提供不同的消息框输出结果。

目前我每次想要更改命令行参数字符串时都必须开始调试。

有没有办法在调试会话期间更改命令行参数?

编辑:我添加了一些示例代码

private static class MyParsers
    {

    public static List<string> args;

    static MyParsers()
    {
        args = Environment.GetCommandLineArgs().ToList();
    }

        public static List<string> ParseOptions()
        {
            return ParseOptions(true);
        }

        public static List<string> ParseOptions(bool caseSensitive)
        {
            return caseSensitive
                   ? args
                   : args.MyExtToLower();
        }

        public static bool OptionExists(string option)
        {
            return OptionExists(option, true);
        }

        public static bool OptionExists(string option, bool caseSensitive)
        {
            return caseSensitive
                       ? ParseOptions().Contains(option)
                       : ParseOptions().MyExtToLower().Contains(option);
        }

        public static bool OptionExists(string option, string delimiter)
        {
            return OptionExists(option, false, delimiter);
        }

        public static bool OptionExists(string option, bool caseSensitive, string delimiter)
        {
            var args = ParseOptions(caseSensitive);
            for (var i = 1; i < args.Count; i++)
            {
                if (args[i].Contains(option + delimiter)) return true;
            }
            return false;
        }
}

然后我致电MessageBox.Show(MyParsers.OptionExists("/list","=").ToString());

如果命令行参数为 / list = blah ,则返回true。

如果命令行参数是 / listary ,则返回false。

您建议使用哪种方法快速更改命令行参数?考虑我正在使用的上述代码。

2 个答案:

答案 0 :(得分:2)

问题不在于更改命令行参数,而在于重新执行已使用不同参数执行的代码。根据我的理解,您需要使用不同的命令行参数来测试您的程序。请考虑以下解决方案以实现您的目标:

  • 定义一些接受PerformMain的方法(string[] args)就像Main方法一样
  • 此方法应执行以前保存在Main方法
  • 中的代码
  • 您的新Main可能包含字符串[]列表,这些是要执行的测试用例
  • 循环遍历string []列表并执行包装器每次传递不同的参数
  • 请注意,PerformMain中的代码包装器必须是“无状态”,这样连续执行才能正常工作
  • 通过这种方式,您可以轻松测试案件的情况

您的代码可能如下所示:

 static void Main(string[] args)
 {
     List<string[]> testCases = new List<string[]>();
     testCases.Add(new string[] { "/test", "xx" });
     testCases.Add(new string[] { "/other" });

     foreach (string[] testCase in testCases)
       Program.PerformMain(testCase);
 }

 static void PerformMain(string[] args)
 {
      // clear state of program
      // execute according to args
 }

答案 1 :(得分:1)

无法更改启动进程的命令行。但是,您可以在应用程序的早期将参数复制到易于访问的“设置”对象中,然后再操作它。

编辑:每次调用命令行时,不是对象中的属性解析命令行,而是将属性更改为常规属性。然后使用Initialise方法(或使用构造函数,甚至),以便在启动时只解析一次命令行。然后,您可以使用立即窗口随意更改属性的值,因为它们不会每次都返回命令行。