调试时如何使用参数启动程序?
Posted
技术标签:
【中文标题】调试时如何使用参数启动程序?【英文标题】: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);
我不想将其注释掉,然后在编译时重新输入。它被设置为启动项目。
【问题讨论】:
Passing command line parameters with Visual Studio C# 的可能重复项 Debugging with command-line parameters in Visual Studio的可能重复 【参考方案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 文件中...)【讨论】:
以上是关于调试时如何使用参数启动程序?的主要内容,如果未能解决你的问题,请参考以下文章