【问题标题】:Is it possible to change command line arguments while debugging?调试时是否可以更改命令行参数?
【发布时间】:2012-08-13 08:57:27
【问题描述】:

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

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

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

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

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。

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

【问题讨论】:

  • 在 VS2010 中,您可以通过在断点处将鼠标悬停在适当的变量上,然后单击要修改的属性值来更改任何您想要的值。
  • @eyossi 代码无关。我只需要在调试时更改传递给应用程序的命令行参数。
  • @veredesmarald 是的,我知道,但我没有将命令行参数存储在任何变量中,并且项目属性的命令行参数部分在调试时显示为灰色。
  • args 仅在程序运行后才存在于 Main 的堆栈中。如果不重新启动程序,您将无法返回以新参数重新运行 Main。相反,您可以使用 gui 或即时窗口来操作值(可能不直接存储在 args 中?),但您可以在程序开始时轻松地将它们移动到另一个本地变量或类变量中,并将其操作到您的心中内容
  • @IneedHelp 如果您没有将命令行参数存储在main 的参数中,那么您将如何使用它们呢?您实际上要完成什么,因为听起来您确实采用了错误的方法...如果您在问题中添加一些代码,我们几乎可以肯定会为您指明更好的方向。

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


【解决方案1】:

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

  • 定义一些方法(PerformMain),就像Main 方法一样接受string[] args
  • 这个方法应该执行之前保存在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
 }

【讨论】:

  • 投票很有帮助,将您的逻辑移动到另一个函数是您需要做的,就像这里显示的那样.. 虽然我仍然会考虑在调用 PerformMain 时使用即时窗口和断点,所以你可以即时操纵值,指出无状态也非常重要
【解决方案2】:

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

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

【讨论】:

  • 好的,所以我知道无法更改启动进程的命令行。考虑到我在编辑问题中提供的代码,您如何建议我实现一个易于访问的“设置”对象?
  • 感谢您的更新。我曾尝试在构造函数中只保存一次参数列表,但我不知道如何从即时窗口更改参数列表元素。我已经用新代码编辑了这个问题。我还是做错了吗?
最近更新 更多