调试时如何启动带参数的程序?

Kas*_*sen 91 c# visual-studio-2008 visual-studio visual-studio-debugging

我想在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);
}
Run Code Online (Sandbox Code Playgroud)

我不想评论它,然后在编译时再回来.如何在调试时使用参数启动程序?它被设置为StartUp项目.

Øyv*_*hen 154

去吧Project-><Projectname> Properties.然后单击Debug选项卡,并在所调用的文本框中填写您的参数Command line arguments.

  • 参数可以(必须?)填充到分隔的“命令行参数”空间中(就像使用命令行一样)。我不确定是否还有其他方法,但也许您可以将其添加到您的答案中。 (2认同)
  • 我一直在寻找这个答案一个星期!谢谢! (2认同)

Hom*_*mam 49

我建议使用如下指令:

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

            Console.WriteLine(args[0]);
        }
Run Code Online (Sandbox Code Playgroud)

祝好运!

  • Omho这个答案就是答案.每次要使用一组新的命令行参数进行调试时,编辑项目设置是一项繁琐的工作.当它写成这样的时候,你可以简单地写下你要检查的所有测试用例,只需切换每个测试用例就可以激活它.如果你突然在一个不同语言的Visual Studio(不是你曾经使用过的那个)的Visual Studio前面,速度更快,证明特别有用,这正是我的情况,虽然我知道语言,但翻译很糟糕,即使是母语人士也无法妥善处理.:d (4认同)
  • 两个好的答案,我更喜欢这个,因为它更容易更改或引用(虽然它不一定是通过属性的麻烦:p,可能是额外的鼠标点击左右) (2认同)

Bil*_*hby 6

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

Visual Studio 启动选项:

Visual Studio 启动选项

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

问题示例:

Visual Studio 中的错误示例

在尝试了几个之后,我的最终解决方案是在我的参数处理器中编写一个快速查找环境变量的方法。我在传入变量值中添加了对 % 的检查,如果找到,则查找环境变量并替换该值。这适用于 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("%", ""));
                    }
Run Code Online (Sandbox Code Playgroud)

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

批量使用示例

批处理文件示例


dav*_*v_i 5

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

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

#if DEBUG
    public class Program
#else
    class Program
#endif
Run Code Online (Sandbox Code Playgroud)

和相同static Main(string[] args)

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

[assembly: InternalsVisibleTo("TestAssembly")]
Run Code Online (Sandbox Code Playgroud)

给你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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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