WinForms uygulamasına komut satırı bağımsız değişkenlerini nasıl iletirim?


106

İki farklı WinForms uygulamam var, AppA & AppB. Her ikisi de .NET 2.0 kullanıyor.

AppA'da AppB'yi açmak istiyorum, ancak ona komut satırı argümanlarını iletmem gerekiyor. Komut satırında ilettiğim argümanları nasıl tüketirim?

Bu benim AppB'deki mevcut ana yöntemim, ancak bunu değiştirebileceğinizi düşünmüyorum?

  static void main()
  {
  }

Yanıtlar:


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

Argümanlar daha sonra argsdize dizisinde saklanacaktır :

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

6
girdi: "ne olursa olsun.exe -v foo / lol nisp". Çıktı: args [0] = "-v"; args [1] = "foo"; args [2] = "/ lol"; args [3] = "nisp"; Daha kolay ne olabilir?
Callum Rogers

'string [] args'ı bir yıl sonra defalarca gördüğüme inanamıyorum ve şimdiye kadar hiç aklıma gelmedi! haha
Niklas

1
Görünüşe göre args [0] çalışan uygulamanın tam yolu ve exe adı ve args [1] ilk parametre.
Allan F

197

Winforms uygulamanız için args ile çalışmanın en iyi yolu

string[] args = Environment.GetCommandLineArgs();

Muhtemelen bunu , kod tabanınız aracılığıyla dizinin kullanımını sağlamlaştırmak için bir numaralandırma kullanımıyla birleştirebilirsiniz.

"Ve bunu uygulamanızın herhangi bir yerinde kullanabilirsiniz, sadece bir konsol uygulamasında olduğu gibi main () yönteminde kullanmakla sınırlı değilsiniz."

Bulunduğu yer: BURADA


25
Dizideki ilk öğe, çalıştıran programın dosya adını içerir. Dosya adı mevcut değilse, ilk öğe String.Empty'ye eşittir. Kalan öğeler, komut satırına girilen ek simgeleri içerir.
EKanadily

@docesam Bana çok yardımcı oldu, teşekkürler! Neden programın kendisini metin olarak yüklemeye çalıştığını merak ediyordum.
Kaitlyn


Yıllarca C # geliştirdikten sonra bu yöntemin var olduğunu hiç bilmiyordum. Güzel.
CathalMF

1
Bu yöntemi kullanmanın parametreleri göndermenin faydası var main(string[] args)mı?
1818

12

Environment.CommandLine özelliğine erişerek herhangi bir .Net uygulamasının komut satırını yakalayabilirsiniz. Komut satırını tek bir dize olarak alacak, ancak aradığınız verileri ayrıştırmak çok zor olmamalı.

Boş bir Main yöntemine sahip olmak bu özelliği veya başka bir programın komut satırı parametresi ekleme yeteneğini etkilemez.


26
Veya tıpkı Main (string [] args) gibi bir argüman dizisi döndüren Environment.GetCommandLineArgs () 'ı kullanın
Brettski

11

İki argüman iletmeniz gereken bir program geliştirmeniz gerektiğini düşünün. Öncelikle Program.cs sınıfını açmanız ve aşağıdaki gibi Main yönteminde argümanlar eklemeniz ve bu argümanları Windows formunun yapıcısına iletmeniz gerekir.

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 form sınıfında, aşağıdaki gibi Program sınıfından giriş değerlerini kabul eden parametreleştirilmiş bir kurucu ekleyin .

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

Bunu test etmek için, komut istemini açabilir ve bu exe'nin bulunduğu konuma gidebilirsiniz. Dosya adını ve ardından parmeter1 parametre2'yi verin. Örneğin aşağıya bakın

C:\MyApplication>Yourexename p10 5

Yukarıdaki C # kodundan, değeri olan bir Messagebox'ı isteyecektir p10 5.


7

Bu imzayı kullanırsınız: (c # içinde) static void Main (string [] args)

Bu makale, ana işlevin programlamadaki rolünü de açıklamaya yardımcı olabilir: http://en.wikipedia.org/wiki/Main_function_(programming)

İşte size küçük bir örnek:

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

Bu herkes için popüler bir çözüm olmayabilir, ancak C # kullanırken bile Visual Basic'teki Uygulama Çerçevesini seviyorum.

Referans ekle Microsoft.VisualBasic

WindowsFormsApplication adlı bir sınıf oluşturun

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 () rutininizi böyle görünecek şekilde değiştirin

static class Program
{

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

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

Bu yöntem bazı ek yararlı özellikler sunar (SplashScreen desteği ve bazı yararlı olaylar gibi)

public event NetworkAvailableEventHandler NetworkAvailabilityChanged;d.
public event ShutdownEventHandler Shutdown;
public event StartupEventHandler Startup;
public event StartupNextInstanceEventHandler StartupNextInstance;
public event UnhandledExceptionEventHandler UnhandledException;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.