Як запустити програму з аргументами під час налагодження?


109

Я хочу налагодити програму в 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);
}

Я не хочу це коментувати, а потім повертатись під час компіляції. Як я можу запустити програму з аргументів під час налагодження? Він задається як проект StartUp.



Відповіді:


172

Перейти до Project-><Projectname> Properties. Потім натисніть на Debugвкладку та заповніть свої аргументи у текстовому полі, що називається Command line arguments.


1
Аргументи можна (обов'язково?) Command line argumentsЗаповнити розділеним пробілом (як ви це робите, використовуючи командний рядок). Я не впевнений, чи є інші способи, але, можливо, ви можете додати це до своєї відповіді.
— d4Rk

2
Я вже тиждень шукаю цю відповідь! Дякую!
— птах2920

Не забудьте мовленнєві позначки навколо аргументів команд, що містять пробіли, що мене вигнало.
— Дейл

Чи можна використовувати названі параметри для використання бібліотек, таких як аналізатор командного рядка? наприклад, як я можу пропустити щось на кшталт -url https://google.com -p pass -u user?
— Анімеш

54

Я б запропонував використовувати такі директиви :

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

            Console.WriteLine(args[0]);
        }

Удачі!


2
Обидва гарні відповіді, мені це більше подобається лише тому, що це легше змінити чи посилатися (хоча це не обов’язково клопоту, що переглядає властивості: p, можливо, зайвий клацання миші чи так)
— Ендрю Джекман,

Я розберуся в цьому. Дякую.
— Каспер Хансен

1
Я згоден з рішенням Хомама. Хоча для невеликої програми налаштування властивостей проекту -> Налагодження аргументів вкладки командного рядка є більш прямим та простим способом налагодження, для великих програм, що використовують Директиви, є більш корисними та витонченими.
— Сабіта

Обидва рішення ідеальні. але я начебто віддаю перевагу рішення Хомама. Її елегантності не потрібно повозитися з проектними секціями, про які можна забути подбати. На думку seconf, можна також забути внесені зміни коду, але вони принаймні "видимі".
— INNNT

4
Омхо ця відповідь - це відповідь. Це копітка робота відредагувати параметри проекту щоразу, коли ви хочете налагодити новий набір параметрів командного рядка. Коли це написано так, ви можете просто записати всі тестові випадки, які ви хочете перевірити, і просто переключити коментарі до кожного, щоб активувати його. Набагато швидше і виявляється особливо корисним, якщо ви раптом перебуваєте перед Visual Studio іншою мовою (не тією, з якою ви звикли працювати), що саме є моїм випадком, і хоча я знаю мову, переклад жахливий і навіть носія мови не може з цим правильно впоратися. : D
— rbaleksandar

6

Моя пропозиція полягала б у використанні модульних тестів.

У вашій програмі виконайте такі перемикачі Program.cs:

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

і те саме для static 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);
        }
    }
}

Таким чином, ви можете в автоматизованому вигляді перевірити кілька входів аргументів, не редагуючи свій код або змінюючи налаштування меню кожного разу, коли ви хочете перевірити щось інше.


3

Я прийшов на цю сторінку, тому що у мене є конфіденційна інформація в параметрах мого командного рядка, і я не хотів, щоб вони зберігалися в сховищі коду. Я використовував змінні системного середовища для утримання значень, які можна було встановити на кожній машині збирання або розробки відповідно до потреб. Розширення з змінним середовищем чудово працює в процесах Shell Batch, але не у Visual Studio.

Параметри запуску Visual Studio:

Параметри запуску Visual Studio

Однак Visual Studio не поверне значення змінної, а ім'я змінної.

Приклад випуску:

Приклад помилки у Visual Studio

Моє остаточне рішення після спроби декількох тут на SO було написати швидкий пошук змінної Environment у моєму процесорі аргументів. Я додав чек на% у вхідному значенні змінної, і якщо він знайдений, знайдіть змінну середовища та замініть це значення. Це працює і в 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

Приклад Використання в партії

Приклад пакетного файлу


1

Для коду Visual Studio :

  • відчинено launch.json файл
  • Додайте аргументи до своєї конфігурації:

"args": ["якийсь аргумент", "інший"],

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.