Как мне запустить программу с аргументами при отладке?

110

Я хочу отладить программу в 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 Project.

Каспер Хансен
источник

Ответы:

173

Перейти к Project-><Projectname> Properties. Затем щелкните Debugвкладку и введите свои аргументы в текстовое поле с именем Command line arguments.

Эйвинд Братен
источник
1
Аргументы могут (должны?) Быть заполнены Command line argumentsразделенными пробелами (как вы это сделали бы, используя командную строку). Не уверен, есть ли другие способы, но, возможно, вы можете добавить это к своему ответу.
d4Rk
2
Целую неделю искал этот ответ! Спасибо!
bird2920
Не забывайте о речевых знаках вокруг аргументов команд, содержащих пробелы, которые меня зацепили.
Дейл
Можно ли использовать именованные параметры при использовании библиотек, таких как парсер командной строки? например, как я могу передать что-то вроде -url https://google.com -p pass -u user?
Animesh
54

Я бы предложил использовать следующие директивы :

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

            Console.WriteLine(args[0]);
        }

Удачи!

Хомам
источник
2
Оба хороших ответа, мне это больше нравится только потому, что его легче изменить или ссылаться (хотя это не обязательно хлопотно, просматривая свойства: p, может быть, дополнительный щелчок мыши или около того)
Эндрю Джекман
Я займусь этим. Спасибо.
Kasper Hansen
1
Я согласен с решением Homam. Хотя для небольшой программы установка аргументов командной строки Project Properties -> Debug Tab является более прямым и простым способом отладки, для больших приложений использование директив более полезно и элегантно.
Sabitha
Оба решения идеальны. но я предпочитаю решение от Homam. Его элегантность не требует возни с настройками проекта, о которых можно забыть позаботиться. При второй мысли можно также забыть внесенные изменения кода, но они, по крайней мере, "видимы".
IUnknown
4
Омхо, это ответ. Редактировать настройки проекта каждый раз, когда вы хотите отладить с новым набором параметров командной строки, утомительно. Когда это написано так, вы можете просто записать все тестовые примеры, которые хотите проверить, и просто переключать комментарии к каждому, чтобы активировать его. Намного быстрее и оказывается особенно полезным, если вы внезапно сталкиваетесь с Visual Studio на другом языке (не на том, с которым вы привыкли работать), что как раз в моем случае, и хотя я знаю этот язык, перевод ужасен и даже носитель языка не может с этим справиться. : D
rbaleksandar
6

Я предлагаю использовать модульные тесты.

В вашем приложении выполните следующие действия 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);
        }
    }
}

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

dav_i
источник
3

Я зашел на эту страницу, потому что у меня есть конфиденциальная информация в параметрах командной строки, и я не хотел, чтобы они хранились в репозитории кода. Я использовал переменные системной среды для хранения значений, которые можно было установить на каждой машине сборки или разработки по мере необходимости для каждой цели. Расширение переменных среды отлично работает в пакетных процессах оболочки, но не в 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": ["какой-то аргумент", "еще один"],

Аламаканамбра
источник