Как передать аргументы командной строки приложению WinForms?

106

У меня есть два разных приложения WinForms: AppA и AppB. Оба работают под управлением .NET 2.0.

В AppA я хочу открыть AppB, но мне нужно передать ему аргументы командной строки. Как использовать аргументы, передаваемые в командной строке?

Это мой текущий основной метод в AppB, но я не думаю, что вы можете это изменить?

  static void main()
  {
  }
MRFerocius
источник

Ответы:

118
static void Main(string[] args)
{
  // For the sake of this example, we're just printing the arguments to the console.
  for (int i = 0; i < args.Length; i++) {
    Console.WriteLine("args[{0}] == {1}", i, args[i]);
  }
}

Затем аргументы будут сохранены в argsмассиве строк:

$ AppB.exe firstArg secondArg thirdArg
args[0] == firstArg
args[1] == secondArg
args[2] == thirdArg
Томас
источник
6
ввод: "what.exe -v foo / lol nisp". Вывод: args [0] = "-v"; args [1] = "фу"; аргументы [2] = "/ лол"; args [3] = "нисп"; Что может быть проще?
Каллум Роджерс,
Не могу поверить, что я видел этот 'string [] args' так много раз после целого года, и мне это никогда не приходило в голову, черт возьми, это было до сих пор! ха-ха
Никлас
1
Кажется, что args [0] - это полный путь и имя exe запущенного приложения, а args [1] - это первый параметр.
Аллан Ф
197

Лучший способ работать с аргументами для вашего приложения winforms - использовать

string[] args = Environment.GetCommandLineArgs();

Вы, вероятно, можете объединить это с использованием перечисления, чтобы укрепить использование массива через вашу базу кода.

«И вы можете использовать это где угодно в вашем приложении, вы не ограничены только использованием его в методе main (), как в консольном приложении».

Найдено: ЗДЕСЬ

Ганнибул33
источник
25
Первый элемент в массиве содержит имя файла исполняющейся программы. Если имя файла недоступно, первый элемент равен String.Empty. Остальные элементы содержат любые дополнительные токены, введенные в командной строке.
EKanadily
@docesam Это мне очень помогло, спасибо! Было интересно, почему он все время пытался загрузить саму программу как текст.
Кейтлин
После многих лет разработки C # я никогда не знал, что этот метод существует. Ницца.
CathalMF
1
есть ли преимущество в использовании этого метода по сравнению с отправкой параметров main(string[] args)?
Adjit
12

Вы можете получить командную строку любого .Net-приложения, обратившись к свойству Environment.CommandLine. Командная строка будет представлена ​​в виде единой строки, но анализ данных, которые вы ищете, не должен быть очень сложным.

Наличие пустого метода Main не повлияет на это свойство или на возможность другой программы добавить параметр командной строки.

ДжаредПар
источник
26
Или используйте Environment.GetCommandLineArgs (), который возвращает строковый массив аргументов точно так же, как Main (string [] args)
Бреттски
11

Предположим, вам нужно разработать программу, в которой вам нужно передать два аргумента. Прежде всего, вам нужно открыть класс Program.cs и добавить аргументы в методе Main, как показано ниже, и передать эти аргументы конструктору формы Windows.

static class Program
{    
   [STAThread]
   static void Main(string[] args)
   {            
       Application.EnableVisualStyles();
       Application.SetCompatibleTextRenderingDefault(false);
       Application.Run(new Form1(args[0], Convert.ToInt32(args[1])));           
   }
}

В классе форм Windows добавьте параметризованный конструктор, который принимает входные значения из класса Program, как показано ниже.

public Form1(string s, int i)
{
    if (s != null && i > 0)
       MessageBox.Show(s + " " + i);
}

Чтобы проверить это, вы можете открыть командную строку и перейти в то место, где находится этот исполняемый файл. Укажите имя файла, затем параметр1 параметр2. Например, см. Ниже

C:\MyApplication>Yourexename p10 5

Из приведенного выше кода C # он предложит Messagebox со значением p10 5.

Сарат Аванаву
источник
7

Вы используете эту подпись: (в C #) static void Main (string [] args)

Эта статья также может помочь объяснить роль основной функции в программировании: http://en.wikipedia.org/wiki/Main_function_(programming)

Вот вам небольшой пример:

class Program
{
    static void Main(string[] args)
    {
        bool doSomething = false;

        if (args.Length > 0 && args[0].Equals("doSomething"))
            doSomething = true;

        if (doSomething) Console.WriteLine("Commandline parameter called");
    }
}
Крисгардвик
источник
4

Возможно, это решение не для всех популярно, но мне нравится Application Framework в Visual Basic, даже при использовании C #.

Добавить ссылку на Microsoft.VisualBasic

Создайте класс под названием WindowsFormsApplication

public class WindowsFormsApplication : WindowsFormsApplicationBase
{

    /// <summary>
    /// Runs the specified mainForm in this application context.
    /// </summary>
    /// <param name="mainForm">Form that is run.</param>
    public virtual void Run(Form mainForm)
    {
        // set up the main form.
        this.MainForm = mainForm;

        // Example code
        ((Form1)mainForm).FileName = this.CommandLineArgs[0];

        // then, run the the main form.
        this.Run(this.CommandLineArgs);
    }

    /// <summary>
    /// Runs this.MainForm in this application context. Converts the command
    /// line arguments correctly for the base this.Run method.
    /// </summary>
    /// <param name="commandLineArgs">Command line collection.</param>
    private void Run(ReadOnlyCollection<string> commandLineArgs)
    {
        // convert the Collection<string> to string[], so that it can be used
        // in the Run method.
        ArrayList list = new ArrayList(commandLineArgs);
        string[] commandLine = (string[])list.ToArray(typeof(string));
        this.Run(commandLine);
    }

}

Измените подпрограмму Main (), чтобы она выглядела так

static class Program
{

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        var application = new WindowsFormsApplication();
        application.Run(new Form1());
    }
}

Этот метод предлагает некоторые дополнительные полезные функции (например, поддержку SplashScreen и некоторые полезные события).

public event NetworkAvailableEventHandler NetworkAvailabilityChanged;d.
public event ShutdownEventHandler Shutdown;
public event StartupEventHandler Startup;
public event StartupNextInstanceEventHandler StartupNextInstance;
public event UnhandledExceptionEventHandler UnhandledException;
Юрген Штайнблок
источник