【问题标题】:How do I start a program with arguments when debugging?调试时如何使用参数启动程序?
【发布时间】:2011-06-15 00:53:42
【问题描述】:

我想在 Visual Studio 2008 中调试一个程序。问题是如果它没有得到参数就会退出。这是来自 main 方法:

if (args == null || args.Length != 2 || args[0].ToUpper().Trim() != "RM") 
{
    Console.WriteLine("RM must be executed by the RSM.");
    Console.WriteLine("Press any key to exit program...");
    Console.Read();
    Environment.Exit(-1);
}

我不想将其注释掉,然后在编译时重新输入。调试时如何使用参数启动程序?它被设置为启动项目。

【问题讨论】:

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


【解决方案1】:

转到Project-><Projectname> Properties。然后点击Debug 选项卡,并在名为Command line arguments 的文本框中填写您的参数。

【讨论】:

  • 参数可以(必须?)填充到Command line arguments 空格分隔(就像你会做的那样,使用命令行)。我不确定是否还有其他方法,但也许您可以将其添加到您的答案中。
  • 我一直在寻找这个答案一个星期!谢谢!
  • 不要忘记包含空格的命令参数周围的语音标记,这让我很困惑。
  • 在使用命令行解析器等库时是否可以使用命名参数?例如我怎样才能传递-url https://google.com -p pass -u user之类的东西?
【解决方案2】:

我建议使用directives,如下所示:

        static void Main(string[] args)
        {
#if DEBUG
            args = new[] { "A" };
#endif

            Console.WriteLine(args[0]);
        }

祝你好运!

【讨论】:

  • 两个很好的答案,我更喜欢这个只是因为它更容易更改或引用(虽然它不一定是通过属性的麻烦:p,可能是额外的鼠标点击左右)
  • 我会调查的。谢谢。
  • 我同意 Homam 的解决方案。虽然对于小程序来说,设置项目属性 -> 调试选项卡的命令行参数是一种更直接、更简单的调试方法,但对于使用指令的大型应用程序来说更有用和优雅。
  • 两种解决方案都很完美。但是,我更喜欢 Homam 的解决方案。它的优雅不需要修补人们可能忘记照顾的项目设置。在一个 seconf 中,人们可能也会忘记所做的代码更改,但它们至少是“可见的”。
  • Omho 这个答案就是答案。每次您想使用一组新的命令行参数进行调试时,编辑项目设置是一项繁琐的工作。当它像这样编写时,您可以简单地写下您想要检查的所有测试用例,然后切换每个上的 cmets 以激活它。如果您突然出现在使用另一种语言(不是您习惯使用的语言)的 Visual Studio 面前,速度会快得多并且证明特别有用,这正是我的情况,虽然我知道这种语言,但翻译很糟糕,而且即使是母语人士也无法妥善处理。 :D
【解决方案3】:

我的建议是使用单元测试。

在您的应用程序中,在Program.cs 中执行以下开关:

#if DEBUG
    public class Program
#else
    class Program
#endif

static Main(string[] args) 也是如此。

或者通过添加使用Friend Assemblies

[assembly: InternalsVisibleTo("TestAssembly")]

致您的AssemblyInfo.cs。

然后创建一个单元测试项目和一个看起来有点像这样的测试:

[TestClass]
public class TestApplication
{
    [TestMethod]
    public void TestMyArgument()
    {
        using (var sw = new StringWriter())
        {
            Console.SetOut(sw); // this makes any Console.Writes etc go to sw

            Program.Main(new[] { "argument" });

            var result = sw.ToString();

            Assert.AreEqual("expected", result);
        }
    }
}

通过这种方式,您可以自动测试多个参数输入,而无需在每次要检查不同内容时编辑代码或更改菜单设置。

【讨论】:

  • 哇,问题是关于为调试会话提供参数,你提到单元测试?这与问题有什么关系?
【解决方案4】:

我来到这个页面是因为我的命令行参数中有敏感信息,并且不希望它们存储在代码存储库中。我使用系统环境变量来保存值,可以根据需要在每个构建或开发机器上设置这些值。环境变量扩展在 Shell 批处理过程中效果很好,但不适用于 Visual Studio。

Visual Studio 启动选项:

但是,Visual Studio 不会返回变量值,而是变量的名称。

问题示例:

我在 S.O. 上尝试了几次之后的最终解决方案。是在我的参数处理器中快速查找环境变量。我在传入的变量值中添加了对 % 的检查,如果找到,则查找环境变量并替换该值。这适用于 Visual Studio 和我的构建环境。

foreach (string thisParameter in args)
            {
                if (thisParameter.Contains("="))
                {
                    string parameter = thisParameter.Substring(0, thisParameter.IndexOf("="));
                    string value = thisParameter.Substring(thisParameter.IndexOf("=") + 1);

                    if (value.Contains("%"))
                    {   //Workaround for VS not expanding variables in debug
                        value = Environment.GetEnvironmentVariable(value.Replace("%", ""));
                    }

这允许我在示例批处理文件中使用相同的语法,并使用 Visual Studio 进行调试。没有帐户信息或 URL 保存在 GIT 中。

批量使用示例

【讨论】:

    【解决方案5】:

    对于 Visual Studio 代码:

    • 打开launch.json文件
    • 将参数添加到您的配置中:

    "args": ["一些参数", "另一个"],

    【讨论】:

      【解决方案6】:

      对于 .NET Core 控制台应用,您可以通过两种方式执行此操作 - 从 launchsettings.json 或属性菜单。

      Launchsettings.json

      或右键单击项目>属性>左侧的调试选项卡

      请参阅“应用程序参数:”

      • 这是“”(空格)分隔的,不需要任何逗号。刚开始打字。每个空格“”代表一个新的输入参数。
      • (您在此处所做的任何更改都会反映在 launchsettings.json 文件中...)

      【讨论】:

        猜你喜欢
        • 2012-05-09
        • 2014-11-18
        • 2016-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-27
        • 1970-01-01
        • 2022-12-21
        相关资源
        最近更新 更多