Як передати аргументи командного рядка програмі WinForms?


105

У мене є два різних програми WinForms, AppA та AppB. Обидва працюють .NET 2.0.

В AppA я хочу відкрити AppB, але мені потрібно передати йому аргументи командного рядка. Як я споживаю аргументи, які я передаю в командному рядку?

Це мій основний метод в AppB, але я не думаю, що ви можете це змінити?

  static void main()
  {
  }

Відповіді:


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] = "foo"; args [2] = "/ lol"; args [3] = "nisp"; Що може бути простіше?
Callum Rogers

не можу повірити, що я бачив, що 'string [] args' стільки разів через цілий рік, і це ніколи не траплялося мені wtf, це було досі! ха-ха
Ніклас

1
Здається, що args [0] - це повний шлях та ім'я exe запущеної програми, а args [1] - перший параметр.
Аллан F

197

Найкращий спосіб роботи з аргументами для вашої програми winforms - це використання

string[] args = Environment.GetCommandLineArgs();

Ви, ймовірно, можете поєднати це з використанням enum, щоб закріпити використання масиву, використовуючи вашу кодову базу.

"І ви можете використовувати це де завгодно у вашій програмі. Ви не обмежуєтесь цим лише в основному () методі, як у консольному додатку."

Знайдено за адресою: ТУТ


25
Перший елемент масиву містить ім'я файлу виконавчої програми. Якщо ім'я файлу недоступне, перший елемент дорівнює String.Empty. Решта елементів містять будь-які додаткові маркери, введені в командному рядку.
EKanadily

@docesam Це мені дуже допомогло, дякую! Мені було цікаво, чому вона постійно намагається завантажити програму як текст.
Кейтлін


Після років розвитку C # я ніколи не знав, що існує цей метод. Приємно.
CathalMF

1
чи є користь від використання цього методу проти надсилання параметрів main(string[] args)?
Аджит

12

Ви можете захопити командний рядок будь-якої програми .Net, відвідавши властивість Environment.CommandLine. Він буде мати командний рядок як єдиний рядок, але розбір даних, які ви шукаєте, не повинен бути дуже складним.

Порожній основний метод не вплине на це властивість або на здатність іншої програми додавати параметр командного рядка.


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);
}

Щоб перевірити це, ви можете відкрити командний рядок і перейти до місця, де розміщений цей exe. Дайте ім'я файлу, потім параметр1 параметр2. Наприклад, див. Нижче

C:\MyApplication>Yourexename p10 5

З наведеного вище коду C # він запропонує повідомлення з значенням p10 5.


7

Ви використовуєте цей підпис: (in 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

Це може бути не популярним рішенням для всіх, але мені подобається Framework 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);
    }

}

Змініть основний () режим, щоб він виглядав так

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