Comment démarrer un programme avec des arguments lors du débogage?

110

Je veux déboguer un programme dans Visual Studio 2008. Le problème est qu'il se ferme s'il n'obtient pas d'arguments. Ceci provient de la méthode principale:

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

Je ne veux pas le commenter, puis revenir lors de la compilation. Comment puis-je démarrer le programme avec des arguments lors du débogage? Il est défini comme projet de démarrage.

Kasper Hansen
la source

Réponses:

173

Allez à Project-><Projectname> Properties. Cliquez ensuite sur l' Debugonglet et remplissez vos arguments dans la zone de texte appelée Command line arguments.

Øyvind Bråthen
la source
1
Les arguments peuvent (doivent?) Être remplis dans les Command line argumentsespaces séparés (comme vous le feriez en utilisant la ligne de commande). Je ne sais pas s'il existe d'autres moyens, mais vous pouvez peut-être ajouter ceci à votre réponse.
d4Rk
2
Je cherchais cette réponse depuis une semaine! Je vous remercie!
bird2920
N'oubliez pas les marques de discours autour des arguments de commande contenant des espaces, qui m'ont surpris.
Dale
Est-il possible d'utiliser des paramètres nommés lors de l'utilisation de bibliothèques telles que l'analyseur de ligne de commande? par exemple, comment puis-je passer quelque chose comme -url https://google.com -p pass -u user?
Animesh le
54

Je suggérerais d'utiliser les directives comme les suivantes:

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

            Console.WriteLine(args[0]);
        }

Bonne chance!

Homam
la source
2
Les deux bonnes réponses, j'aime plus cela uniquement parce qu'il est plus facile de changer ou de référencer (bien que ce ne soit pas nécessairement un problème de passer par les propriétés: p, peut-être un clic de souris supplémentaire ou plus)
Andrew Jackman
J'examinerai ceci. Merci.
Kasper Hansen
1
Je suis d'accord avec Homam's Solution. Bien que pour un petit programme, définir les propriétés du projet -> Paramètres de ligne de commande de l'onglet Déboguer est un moyen plus direct et plus simple de déboguer, pour les grandes applications utilisant des directives sont plus utiles et élégantes.
Sabitha
Les deux solutions sont parfaites. mais, je préfère en quelque sorte la solution d'Homam. Son élégance n'a pas besoin de bricoler avec les décors de projet dont on peut oublier de s'occuper. Sur une seconde pensée, on peut aussi oublier les changements de code effectués mais ils sont au moins "visibles".
IUnknown
4
Omho cette réponse est LA réponse. C'est une tâche fastidieuse de modifier les paramètres du projet chaque fois que vous souhaitez déboguer avec un nouvel ensemble de paramètres de ligne de commande. Quand c'est écrit comme ça, vous pouvez simplement écrire tous les cas de test que vous souhaitez vérifier et simplement basculer les commentaires sur chacun pour l'activer. Beaucoup plus rapide et s'avère particulièrement utile si vous êtes soudainement devant un Visual Studio dans une langue différente (pas celle avec laquelle vous avez l'habitude de travailler), ce qui est exactement mon cas et bien que je connaisse la langue, la traduction est horrible et même un locuteur natif ne peut pas le gérer correctement. : D
rbaleksandar
6

Ma suggestion serait d'utiliser des tests unitaires.

Dans votre application, effectuez les commutations suivantes dans Program.cs:

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

et la même chose pour static Main(string[] args).

Ou utilisez les assemblages d'amis en ajoutant

[assembly: InternalsVisibleTo("TestAssembly")]

à ton AssemblyInfo.cs .

Créez ensuite un projet de test unitaire et un test qui ressemble un peu à ceci:

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

De cette façon, vous pouvez, de manière automatisée, tester plusieurs entrées d'arguments sans avoir à modifier votre code ou à modifier un paramètre de menu chaque fois que vous souhaitez vérifier quelque chose de différent.

dav_i
la source
3

Je suis venu sur cette page parce que j'ai des informations sensibles dans mes paramètres de ligne de commande et que je ne voulais pas qu'elles soient stockées dans le référentiel de code. J'utilisais des variables d'environnement système pour contenir les valeurs, qui pouvaient être définies sur chaque machine de construction ou de développement selon les besoins pour chaque objectif. L'expansion des variables d'environnement fonctionne très bien dans les processus Shell Batch, mais pas dans Visual Studio.

Options de démarrage de Visual Studio:

Options de démarrage de Visual Studio

Cependant, Visual Studio ne renvoie pas la valeur de la variable, mais le nom de la variable.

Exemple de problème:

Exemple d'erreur dans Visual Studio

Ma solution finale après en avoir essayé plusieurs ici sur SO était d'écrire une recherche rapide de la variable d'environnement dans mon processeur d'arguments. J'ai ajouté un chèque pour% dans la valeur de la variable entrante, et si elle est trouvée, recherchez la variable d'environnement et remplacez la valeur. Cela fonctionne dans Visual Studio et dans mon environnement de génération.

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

Cela me permet d'utiliser la même syntaxe dans mes exemples de fichiers de commandes et lors du débogage avec Visual Studio. Aucune information de compte ou URL enregistrée dans GIT.

Exemple d'utilisation en lot

Exemple de fichier batch

Billy Willoughby
la source
1

Pour Visual Studio Code :

  • Ouvrir le launch.jsonfichier
  • Ajoutez des arguments à votre configuration:

"args": ["un argument", "un autre"],

Alamakanambra
la source