web-dev-qa-db-ja.com

コンソールアプリの引数、引数がMainメソッドに渡される方法

これはc#初心者からの質問でしょう。コンソールアプリケーションを作成すると、パラメーターargsが配列文字列としてMainメソッドを取得します。このメソッドがシステムによってどのように呼び出されるか、および引数がMainメソッドにどのように渡されるかがわかりません。たぶん誰かが説明できますか? Mainメソッドは、ある種のコンソールクラスでオーバーライドされますか?

namespace ConsoleApplication1
{
    class Program
    {    
        static void Main(string[] args)
        {    
        }
    }
}
28
Tomas

Mainメソッドは、アプリケーションのエントリポイントです。 ildasm経由でチェックアウトする場合

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint

これがメソッドの呼び出しに役立ちます

引数はsay C:\AppName arg1 arg2 arg3として渡されます

24
V4Vendetta

すべての答えは素晴らしいですし、すべてを非常によく説明しました

しかし、私は指摘したいだけです引数を渡す別の方法 mainメソッドに

ビジュアルスタジオで

  1. プロジェクトを右クリックを選択プロパティ
  2. デバッグタブに移動してから開始オプションセクションでアプリに引数を提供します

この画像のように

Properties window

そして、幸せを知る秘密

52

ランタイムは、コンソールで指定された引数を各スペースで分割します。

あなたが電話した場合

myApp.exe arg1 arg2 arg3

Mainメソッドは、配列を取得します

var args = new string[] {"arg1","arg2","arg3"}
14
Zebi

mainはどのように呼ばれますか?

コンソールアプリケーションテンプレートを使用している場合、コードはコンパイルされます。Mainはアプリケーションへのエントリポイントとして市場にあるため、スタートアップオブジェクトでMainというメソッドが必要です。

デフォルトでは、プロジェクトの適切な設定でスタートアップオブジェクトが指定されておらず、デフォルトでProgramクラスが使用されます。必要に応じて、[ビルド]タブのプロジェクトプロパティでこれを変更できます。

スタートアップオブジェクトとして割り当てるオブジェクトには、Mainという名前のメソッドが含まれている必要があることに注意してください。

引数はどのようにメインメソッドに渡されますか

受け入れられる形式はMyConsoleApp.exe value01 value02などです。

アプリケーションは、各スペースの後に各値をパラメーター配列の個別の要素に割り当てます。

したがって、MyConsoleApp.exe value01 value02は、argsパラメーターに2つの要素があることを意味します。

[0] = "value01"

[1] = "value02"

入力値を解析して使用する方法はユーザー次第です。

これが役に立てば幸いです。

追加資料:

コンソールアプリケーションの作成(Visual C#)

コマンドライン引数(C#プログラミングガイド)

9
Nope

visual Studioでは、単純に渡すか、コマンドライン引数から回避するように行うこともできます

 static void Main(string[] args)
    {
        if (args == null)
        {
            Console.WriteLine("args is null"); // Check for null array
        }
        else
        {
            args=new string[2];
            args[0] = "welcome in";
            args[1] = "www.overflow.com";
            Console.Write("args length is ");
            Console.WriteLine(args.Length); // Write array length
            for (int i = 0; i < args.Length; i++) // Loop through array
            {
                string argument = args[i];
                Console.Write("args index ");
                Console.Write(i); // Write index
                Console.Write(" is [");
                Console.Write(argument); // Write string
                Console.WriteLine("]");
            }
        }
3
Adiii

すべてのマネージドexeにはエントリポイントがあり、ILDASMにコードをロードすると表示されます。エントリポイントは、見出しのCLRで指定され、次のようになります。

enter image description here

1
abhilash

読み取り [〜#〜] msdn [〜#〜]

また、引数へのリンクも含まれています。

短い答え:いいえ、メインはオーバーライドされません。 Visual Studio(実際にはコンパイラー)がexeをビルドするとき、assmeblyの開始点を宣言する必要があり、その点がメイン関数です。

引数を文学的に渡す方法を意味する場合は、コマンドラインからアプリを実行するか(例:appname.exe param1 param2)、プロジェクトのセットアップで入力します(デバッグタブのコマンドライン引数に)

メインでは、例えばこれらの引数を読む必要があります:

for (int i = 0; i < args.Length; i++)
{
    string flag = args.GetValue(i).ToString();
    if (flag == "bla") 
    {
        Bla();
    }
}
1
Nadav Ben-Gal

引数はコマンドライン経由で渡すことができ、引数も指定できません。

1
Aravind

コマンドライン引数は、引数を渡す1つの方法です。 This msdnサンプルはチェックアウトする価値があります。コマンドライン引数の MSDNページ も読む価値があります。

Visual Studio内から、コンソールアプリケーションのプロパティを選択し、[デバッグ]タブを選択して、コマンドライン引数を設定できます。

1
IndigoDelta

関数を作成して渡すこともできます。この関数でmainメソッドを呼び出し、引数をmainメソッドに渡します

static int Main(string[] args)
    {


        foreach (string b in args)
            Console.WriteLine(b+"   ");

        Console.ReadKey();
        aa();
        return 0;

    }
    public static void aa()
    {
        string []aaa={"Adil"};

        Console.WriteLine(Main(aaa));
    }
0
Adiii

ランタイムエンジンのメインメソッドはint main(int argc, char *argv[])のようなものです。ここで、argcは引数の数のカウントであり、argvはそれぞれへのポインターの配列です。ランタイムエンジンは、これをc#により自然な形式に変換します。

そのメインメソッドが呼び出される前は、すべてアセンブリ言語になっています。コマンドライン引数にアクセスできます(オペレーティングシステムが起動するすべてのプロセスで使用できるようにするため)が、そのアセンブリ言語は、完全なコマンドラインの単一の文字列を複数の部分文字列に変換する必要があります(空白を使用してそれらを分離する)それらをmain()に渡す準備ができています。

0
mah