コマンドライン引数をWinFormsアプリケーションに渡すにはどうすればよいですか?


105

AppAとAppBの2つの異なるWinFormsアプリケーションがあります。どちらも.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
入力:「whatever.exe -v foo / lol nisp」。出力:args [0] = "-v"; args [1] = "foo"; args [2] = "/ lol"; args [3] = "nisp"; 何が簡単でしょうか?
Callum Rogers、

私はその 'string [] args'が一年後に何度も見たとは信じられず、それが今まで私に起こったことはありませんでした!笑
ニコラス

1
args [0]は実行中のアプリケーションの絶対パスと実行ファイル名であり、args [1]は最初のパラメーターであるようです。
アランF

197

winformsアプリの引数を使用する最良の方法は、

string[] args = Environment.GetCommandLineArgs();

おそらくこれを列挙型の使用と組み合わせて、コードベース全体で配列の使用を強化することができます。

「そして、あなたはあなたのアプリケーションのどこでもこれを使うことができます、あなたはそれをコンソールアプリケーションのようにmain()メソッドで使うことに制限されているだけではありません。」

見つけた場所:ここ


25
配列の最初の要素には、実行中のプログラムのファイル名が含まれています。ファイル名が使用できない場合、最初の要素はString.Emptyと同じです。残りの要素には、コマンドラインで入力された追加のトークンが含まれています。
EKanadily 2014

@docesamおかげでとても助かりました!プログラム自体をテキストとして読み込もうとする理由を疑問に思っていました。
Kaitlyn、2015


長年のC#開発の後、この方法が存在することを知りませんでした。いいね。
CathalMFは

1
パラメータを送信するよりもこの方法を使用する利点はありますmain(string[] args)か?
Adjit

12

Environment.CommandLineプロパティにアクセスして、任意の.Netアプリケーションのコマンドラインを取得できます。コマンドラインは単一の文字列になりますが、探しているデータの解析はそれほど難しくありません。

Mainメソッドが空であっても、このプロパティや、別のプログラムがコマンドラインパラメータを追加する機能には影響しません。


26
または、Main(string [] args)のように引数の文字列配列を返すEnvironment.GetCommandLineArgs()を使用します
Brettski

11

2つの引数を渡す必要があるプログラムを開発する必要があると考えてください。まず、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が配置されている場所に移動します。ファイル名、次にparmeter1 parameter2を指定します。たとえば、以下を参照してください

C:\MyApplication>Yourexename p10 5

上記のC#コードから、メッセージボックスに値を入力しますp10 5


7

次のシグネチャを使用します:(c#の場合)static void Main(string [] args)

この記事は、プログラミングにおけるmain関数の役割を説明するのにも役立ちます: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

これは一般的なソリューションではないかもしれませんが、C#を使用している場合でも、Visual Basicのアプリケーションフレームワークが好きです。

への参照を追加 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;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.