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


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.