Подтвердить что ты не робот

Аргументы командной строки WPF, умный способ?

Я ищу способ, которым я могу разбирать аргументы командной строки в моем приложении WPF, просто прочитав значение аргумента, переданного пользователем.

В качестве примера

application.exe /setTime 5

есть ли способ для меня иметь некоторый код, где я могу просто сказать:

MessageBox.Show(arg("setTime"));

Будет выводиться 5

Рабочее решение

Как создать интеллектуальные аргументы командной строки WPF

4b9b3361

Ответ 1

Я всегда делаю так, чтобы аргументы указывались как пара "имя"/"значение", например

myprogram.exe -arg1 value1 -arg2 value2

Это означает, что когда вы анализируете командную строку, вы можете поместить пары аргумент/значение в Dictionary с аргументом в качестве ключа. Тогда ваш arg("SetTime") станет:

MessageBox.Show(dictionary["SetTime"]);

(Очевидно, вы не хотите, чтобы фактический словарь был общедоступным.)

Чтобы получить аргументы в первую очередь вы можете использовать:

string[] args = Environment.GetCommandLineArgs();

Это вернет все аргументы, поэтому вам нужно будет проанализировать массив с шагом два (после первой проверки, что длина кратна двум + 1):

Первым элементом массива является имя исполняемой программы - Страница MSDN - поэтому ваш цикл должен начинаться с одного:

for (int index = 1; index < args.Length; index += 2)
{
     dictionary.Add(args[index], args[index+1]);
}

Это происходит в два этапа, когда вы определяете, что каждый аргумент представляет собой пару значений: идентификатор и само фактическое значение, например

my.exe -arg1 value1 -arg2 value2

Затем вы можете просто увидеть, указан ли аргумент, увидев, есть ли ключ -arg1 в словаре, а затем прочитать его значение:

string value;
if (dictionary.TryGetValue(arg, out value))
{
    // Do what ever with the value
}

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

Единственный недостаток этого метода - если у вас есть флаг типа -debug (например), который может быть логически реализован с наличием или отсутствием флага, необходимо указать как -debug true (или 1 или on), но это упрощает вещи, если у вас есть флаги, которые требуют значений (например, пути к файлам конфигурации, строки подключения к базе данных и т.д.)

Ответ 2

Есть еще один способ сделать это в WPF. Вот статья об этом, и вот шаги, которые нужно предпринять:

Сначала вы открываете App.xaml и добавляете Startup="Application_Startup" после StartupUri="Window1.xaml", поэтому ваш App.xaml будет выглядеть следующим образом:

<Application x:Class="ParametersForWPF.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="Window1.xaml"
    Startup="Application_Startup">
    <Application.Resources>
    </Application.Resources>
</Application>

Тогда функция Application_Startup будет автоматически добавлена в ваш файл App.xaml.cs:

public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {

    }
}

Теперь внутри этой функции вы можете проверить args отправленные в приложение. Пример для этого:

private void Application_Startup(object sender, StartupEventArgs e)
{
    foreach(string s in e.Args)
    {
        MessageBox.Show(s);
    }
}

Если они вам нужны как Dictionary вы можете легко реализовать ответ ChrisF внутри функции Application_Startup.