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

C# 调试时如何使用参数启动程序?,c#,visual-studio,visual-studio-2008,visual-studio-debugging,C#,Visual Studio,Visual Studio 2008,Visual Studio Debugging,我想在VisualStudio2008中调试一个程序。问题是,如果它没有得到参数,它就会退出。这是从主要方法: 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...");

我想在VisualStudio2008中调试一个程序。问题是,如果它没有得到参数,它就会退出。这是从主要方法:

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);
}
我不想在编译时将其注释掉然后再重新输入。调试时如何使用参数启动程序?它被设置为启动项目。

转到
Project->Properties
。然后单击
调试
选项卡,在名为
命令行参数
的文本框中填写您的参数。我建议使用以下类似的选项:

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

            Console.WriteLine(args[0]);
        }

祝你好运

我的建议是使用单元测试

在应用程序中,在
Program.cs
中执行以下切换:

#if DEBUG
    public class Program
#else
    class Program
#endif
静态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);
        }
    }
}

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

对于Visual Studio代码

  • 打开
    launch.json
    文件
  • 将参数添加到配置中:
“args”:[“某个参数”,“另一个”]


我之所以来到这个页面,是因为我的命令行参数中有敏感信息,不希望它们存储在代码存储库中。我使用系统环境变量来保存这些值,这些值可以根据每个目的在每个构建或开发机器上进行设置。环境变量扩展在Shell批处理过程中非常有效,但在visualstudio中则不然

Visual Studio开始选项:

但是,VisualStudio不会返回变量值,而是返回变量的名称

问题示例:

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

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进行调试时使用相同的语法。GIT中未保存帐户信息或URL

批量使用示例


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

Launchsettings.json

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

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

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

这两个答案都很好,我更喜欢这个,只是因为它更容易更改或引用(虽然在属性中不一定是一个麻烦:p,可能是额外的鼠标点击等等),我将对此进行研究。谢谢。我同意霍曼的解决方案。虽然对于小程序来说,设置“项目属性->调试”选项卡的命令行参数是一种更直接、更简单的调试方法,但对于使用指令的大型应用程序来说,这两种方法更有用、更优雅。这两种解决方案都是完美的。但是,我比较喜欢霍曼的解决方案。它的优雅不需要修补项目设置,人们可能会忘记照顾。有时,人们可能会忘记所做的代码更改,但它们至少是“可见的”。每次要使用一组新的命令行参数进行调试时,编辑项目设置都是一项繁琐的工作。当它是这样写的时候,你可以简单地写下你想要检查的所有测试用例,然后切换每个测试用例的注释来激活它。如果你突然用另一种语言(不是你习惯使用的语言)出现在Visual Studio面前,速度会快得多,而且证明特别有用。这正是我的情况。虽然我懂这种语言,但翻译很糟糕,甚至母语为英语的人也无法正确处理它d参数可以(必须?)填充到分隔的
命令行参数
空间中(就像使用命令行一样)。我不确定是否还有其他方法,但也许你可以把这个添加到你的答案中。我已经寻找这个答案一周了!非常感谢。别忘了在包含空格的命令参数周围的语音标记,这让我很吃惊。在使用命令行解析器之类的库时,是否可以使用命名参数?e、 g.如何传递类似
-url的内容https://google.com -p pass-u user
?可能重复的wow,问题是为调试会话提供参数,您提到单元测试吗?这与这个问题有什么关系?