调试时如何使用参数启动程序?


108

我想在Visual Studio 2008中调试程序。问题是,如果不获取参数,它将退出。这是从主要方法:

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);
}

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



Answers:


169

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


1
可以(必须?)将参数填充到Command line arguments分隔的空格中(就像使用命令行一样)。我不确定是否还有其他方法,但是也许您可以将其添加到答案中。
d4Rk

2
我一直在寻找这个答案一个星期!谢谢!
bird2920 '17

不要忘记在命令参数周围包含空格的语音标记,这让我很困惑。
戴尔

使用诸如命令行解析器之类的库时,是否可以使用命名参数?例如,我怎样通过类似的东西-url https://google.com -p pass -u user
Animesh

54

我建议使用如下指令

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

            Console.WriteLine(args[0]);
        }

祝好运!


2
这两个很好的答案,我之所以更喜欢它,是因为它更易于更改或引用(尽管不一定会麻烦地遍历属性:p,或者额外单击鼠标左右)
Andrew Jackman

我将对此进行调查。谢谢。
卡巴斯尔·汉森

1
我同意霍马姆的解决方案。尽管对于小型程序而言,设置项目属性->调试选项卡的命令行参数是一种更直接,更轻松的调试方法,但对于使用伪指令的大型应用程序则更为有用和优雅。
Sabitha 2011年

两种解决方案都是完美的。但是,我更喜欢Homam的解决方案。它的优雅不需要修改可能忘记处理的项目设置。一想到seconf,人们可能也会忘记所做的代码更改,但是它们至少是“可见的”。
IUnknown

4
Omho这个答案就是答案。每次要使用一组新的命令行参数进行调试时,编辑项目设置都是一项繁琐的工作。这样编写时,您只需写下所有要检查的测试用例,然后切换每个注释上的注释即可激活它。速度要快得多,如果您突然以另一种语言(不是您曾经使用的一种语言)来到Visual Studio面前,这将证明特别有用,这正是我的情况,尽管我知道该语言,但翻译却糟透了,即使是母语使用者也无法正确处理。:D
rbaleksandar

6

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

在您的应用程序中进行以下切换Program.cs

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

和相同的 static Main(string[] args)

或者通过添加使用“ 朋友装配”

[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);
        }
    }
}

这样,您可以自动地测试参数的多个输入,而不必每次都要检查其他内容时都无需编辑代码或更改菜单设置。


3

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

Visual Studio启动选项:

Visual Studio启动选项

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

问题示例:

Visual Studio中的错误示例

在SO上尝试了几种方法后,我的最终解决方案是在参数处理器中快速查找Environment变量。我在输入的变量值中添加了%的检查,如果找到了,请查找环境变量并替换该值。这适用于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中。

批量使用示例

批处理文件示例


1

对于Visual Studio Code

  • 开启launch.json档案
  • 将args添加到您的配置中:

“ args”:[“一些参数”,“另一个”],

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.