Bagaimana cara menyampaikan argumen baris perintah ke aplikasi WinForms?


106

Saya memiliki dua aplikasi WinForms yang berbeda, AppA & AppB. Keduanya menjalankan .NET 2.0.

Di AppA saya ingin membuka AppB, tetapi saya harus meneruskan argumen baris perintah ke sana. Bagaimana cara menggunakan argumen yang saya berikan di baris perintah?

Ini adalah metode utama saya saat ini di AppB, tetapi saya rasa Anda tidak dapat mengubahnya?

  static void main()
  {
  }

Jawaban:


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

Argumen kemudian akan disimpan dalam argslarik string:

$ AppB.exe firstArg secondArg thirdArg
args[0] == firstArg
args[1] == secondArg
args[2] == thirdArg

6
masukan: "apapun.exe -v foo / lol nisp". Keluaran: args [0] = "-v"; args [1] = "foo"; args [2] = "/ lol"; args [3] = "nisp"; Apa yang lebih mudah?
Callum Rogers

tidak percaya aku melihat 'string [] args' itu berkali-kali setelah setahun penuh dan itu tidak pernah terpikir olehku jika itu sampai sekarang! haha
Niklas

1
Tampaknya args [0] adalah jalur lengkap dan nama exe dari aplikasi yang berjalan dan args [1] adalah parameter pertama.
Allan F

197

Cara terbaik untuk bekerja dengan args untuk aplikasi winforms Anda adalah dengan menggunakan

string[] args = Environment.GetCommandLineArgs();

Anda mungkin dapat memasangkan ini dengan penggunaan enum untuk memperkuat penggunaan larik melalui basis kode Anda.

"Dan Anda dapat menggunakan ini di mana saja dalam aplikasi Anda, Anda tidak hanya dibatasi untuk menggunakannya dalam metode main () seperti dalam aplikasi konsol."

Ditemukan di: DI SINI


25
Elemen pertama dalam larik berisi nama file dari program yang mengeksekusi. Jika nama file tidak tersedia, elemen pertama sama dengan String.Empty. Elemen lainnya berisi token tambahan yang dimasukkan pada baris perintah.
EKanadily

@docesam Itu sangat membantu saya, terima kasih! Ingin tahu mengapa terus mencoba memuat program itu sendiri sebagai teks.
Kaitlyn


Setelah bertahun-tahun pengembangan C #, saya tidak pernah tahu metode ini ada. Bagus.
CathalMF

1
apakah ada keuntungan menggunakan metode ini vs mengirim parameter main(string[] args)?
Adjit

12

Anda dapat mengambil baris perintah dari aplikasi .Net apa pun dengan mengakses properti Environment.CommandLine. Ini akan memiliki baris perintah sebagai string tunggal tetapi mengurai data yang Anda cari seharusnya tidak terlalu sulit.

Memiliki metode Main yang kosong tidak akan mempengaruhi properti ini atau kemampuan program lain untuk menambahkan parameter baris perintah.


26
Atau gunakan Environment.GetCommandLineArgs () yang mengembalikan string array argumen seperti Main (string [] args)
Brettski

11

Anggaplah Anda perlu mengembangkan program di mana Anda harus melewati dua argumen. Pertama-tama, Anda perlu membuka kelas Program.cs dan menambahkan argumen dalam metode Utama seperti di bawah ini dan meneruskan argumen ini ke konstruktor formulir 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])));           
   }
}

Di kelas bentuk windows, tambahkan konstruktor berparameter yang menerima nilai input dari kelas Program seperti di bawah ini.

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

Untuk menguji ini, Anda dapat membuka command prompt dan pergi ke lokasi tempat exe ini ditempatkan. Beri nama file lalu parmeter1 parameter2. Misalnya, lihat di bawah

C:\MyApplication>Yourexename p10 5

Dari kode C # di atas, itu akan meminta kotak pesan dengan nilai p10 5.


7

Anda menggunakan tanda tangan ini: (di c #) static void Main (string [] args)

Artikel ini juga dapat membantu menjelaskan peran fungsi utama dalam pemrograman: http://en.wikipedia.org/wiki/Main_function_(programming)

Inilah sedikit contoh untuk Anda:

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

Ini mungkin bukan solusi yang populer untuk semua orang, tapi saya suka Kerangka Aplikasi dalam Visual Basic, bahkan saat menggunakan C #.

Tambahkan referensi ke Microsoft.VisualBasic

Buat kelas yang disebut 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);
    }

}

Ubah rutinitas Main () Anda agar terlihat seperti ini

static class Program
{

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

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

Metode ini menawarkan beberapa fitur berguna tambahan (seperti dukungan SplashScreen dan beberapa acara berguna)

public event NetworkAvailableEventHandler NetworkAvailabilityChanged;d.
public event ShutdownEventHandler Shutdown;
public event StartupEventHandler Startup;
public event StartupNextInstanceEventHandler StartupNextInstance;
public event UnhandledExceptionEventHandler UnhandledException;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.