Wie starte ich ein Programm mit Argumenten beim Debuggen?

108

Ich möchte ein Programm in Visual Studio 2008 debuggen. Das Problem ist, dass es beendet wird, wenn es keine Argumente erhält. Dies ist von der Hauptmethode:

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

Ich möchte es beim Kompilieren nicht auskommentieren und dann wieder rein. Wie kann ich das Programm beim Debuggen mit Argumenten starten? Es wird als StartUp-Projekt festgelegt.

Kasper Hansen
quelle
Mögliches Duplikat der
Hörnern

Antworten:

169

Gehe zu Project-><Projectname> Properties. Klicken Sie dann auf die DebugRegisterkarte und geben Sie Ihre Argumente in das aufgerufene Textfeld ein Command line arguments.

Øyvind Bråthen
quelle
1
Die Argumente können (müssen?) In den Command line argumentsgetrennten Bereich eingegeben werden (wie Sie dies über die Befehlszeile tun würden). Ich bin mir nicht sicher, ob es andere Möglichkeiten gibt, aber vielleicht können Sie dies Ihrer Antwort hinzufügen.
d4Rk
2
Ich habe seit einer Woche nach dieser Antwort gesucht! Danke dir!
bird2920
Vergessen Sie nicht die Sprachmarkierungen um Befehlsargumente mit Leerzeichen, die mich aufgefangen haben.
Dale
Ist es möglich, benannte Parameter zu verwenden, wenn Bibliotheken wie der Befehlszeilenparser verwendet werden? zB Wie kann ich so etwas passieren -url https://google.com -p pass -u user?
Animesh
54

Ich würde vorschlagen, die Anweisungen wie folgt zu verwenden:

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

            Console.WriteLine(args[0]);
        }

Viel Glück!

Homam
quelle
2
Beide guten Antworten, ich mag das nur mehr, weil es einfacher zu ändern oder zu referenzieren ist (obwohl es nicht unbedingt ein Ärger ist, Eigenschaften durchzugehen: p, vielleicht ein zusätzlicher Mausklick oder so)
Andrew Jackman
Ich werde das untersuchen. Vielen Dank.
Kasper Hansen
1
Ich stimme Homams Lösung zu. Für ein kleines Programm ist das Festlegen der Befehlszeilenargumente auf der Registerkarte Projekteigenschaften -> Debuggen eine direktere und einfachere Möglichkeit zum Debuggen. Für große Anwendungen, die Direktiven verwenden, ist dies jedoch hilfreicher und eleganter.
Sabitha
Beide Lösungen sind perfekt. Aber ich bevorzuge die Lösung von Homam. Seine Eleganz muss nicht an den Projekteinstellungen basteln, um die man sich vielleicht kümmert. Bei einem zweiten Gedanken kann man auch die vorgenommenen Codeänderungen vergessen, aber sie sind zumindest "sichtbar".
Unbekannt
4
Omho diese Antwort ist DIE Antwort. Es ist eine mühsame Aufgabe, die Projekteinstellungen jedes Mal zu bearbeiten, wenn Sie mit einem neuen Satz von Befehlszeilenparametern debuggen möchten. Wenn es so geschrieben ist, können Sie einfach alle Testfälle aufschreiben, die Sie überprüfen möchten, und einfach die Kommentare zu jedem Test umschalten, um es zu aktivieren. Viel schneller und erweist sich als besonders nützlich, wenn Sie plötzlich vor einem Visual Studio in einer anderen Sprache stehen (nicht der, mit der Sie arbeiten), was genau mein Fall ist und obwohl ich die Sprache kenne, ist die Übersetzung schrecklich und Selbst ein Muttersprachler kann nicht richtig damit umgehen. : D
rbaleksandar
6

Mein Vorschlag wäre, Unit Tests zu verwenden.

Führen Sie in Ihrer Anwendung die folgenden Schalter aus Program.cs:

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

und das gleiche für static Main(string[] args).

Oder verwenden Sie alternativ Friend Assemblies durch Hinzufügen

[assembly: InternalsVisibleTo("TestAssembly")]

zu deinem AssemblyInfo.cs.

Erstellen Sie dann ein Unit-Test-Projekt und einen Test, der ungefähr so ​​aussieht:

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

Auf diese Weise können Sie auf automatisierte Weise mehrere Argumenteingaben testen, ohne Ihren Code bearbeiten oder eine Menüeinstellung jedes Mal ändern zu müssen, wenn Sie etwas anderes überprüfen möchten.

dav_i
quelle
3

Ich bin auf diese Seite gekommen, weil meine Befehlszeilenparameter vertrauliche Informationen enthalten und diese nicht im Code-Repository gespeichert werden sollen. Ich habe Systemumgebungsvariablen verwendet, um die Werte zu speichern, die auf jedem Build- oder Entwicklungscomputer je nach Bedarf für jeden Zweck festgelegt werden konnten. Die Erweiterung von Umgebungsvariablen funktioniert hervorragend in Shell-Stapelprozessen, nicht jedoch in Visual Studio.

Startoptionen für Visual Studio:

Startoptionen für Visual Studio

Visual Studio würde jedoch nicht den Variablenwert zurückgeben, sondern den Namen der Variablen.

Beispiel für ein Problem:

Beispiel für einen Fehler in Visual Studio

Meine endgültige Lösung, nachdem ich mehrere hier auf SO ausprobiert hatte, bestand darin, eine schnelle Suche nach der Umgebungsvariablen in meinem Argumentprozessor zu schreiben. Ich habe den eingehenden Variablenwert auf% überprüft. Wenn er gefunden wurde, suchen Sie die Umgebungsvariable und ersetzen Sie den Wert. Dies funktioniert in Visual Studio und in meiner Build-Umgebung.

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("%", ""));
                    }

Auf diese Weise kann ich dieselbe Syntax in meinen Beispiel-Batchdateien und beim Debuggen mit Visual Studio verwenden. Keine Kontoinformationen oder URLs in GIT gespeichert.

Beispiel Verwendung im Stapel

Beispiel für eine Batchdatei

Billy Willoughby
quelle
1

Für Visual Studio-Code :

  • launch.jsonDatei öffnen
  • Fügen Sie Ihrer Konfiguration Argumente hinzu:

"args": ["irgendein Argument", "ein anderes"],

Alamakanambra
quelle