これはc#初心者からの質問でしょう。コンソールアプリケーションを作成すると、パラメーターargsが配列文字列としてMainメソッドを取得します。このメソッドがシステムによってどのように呼び出されるか、および引数がMainメソッドにどのように渡されるかがわかりません。たぶん誰かが説明できますか? Mainメソッドは、ある種のコンソールクラスでオーバーライドされますか?
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
}
}
}
Mainメソッドは、アプリケーションのエントリポイントです。 ildasm
経由でチェックアウトする場合
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
これがメソッドの呼び出しに役立ちます
引数はsay C:\AppName arg1 arg2 arg3
として渡されます
ランタイムは、コンソールで指定された引数を各スペースで分割します。
あなたが電話した場合
myApp.exe arg1 arg2 arg3
Mainメソッドは、配列を取得します
var args = new string[] {"arg1","arg2","arg3"}
mainはどのように呼ばれますか?
コンソールアプリケーションテンプレートを使用している場合、コードはコンパイルされます。Mainはアプリケーションへのエントリポイントとして市場にあるため、スタートアップオブジェクトでMainというメソッドが必要です。
デフォルトでは、プロジェクトの適切な設定でスタートアップオブジェクトが指定されておらず、デフォルトでProgramクラスが使用されます。必要に応じて、[ビルド]タブのプロジェクトプロパティでこれを変更できます。
スタートアップオブジェクトとして割り当てるオブジェクトには、Mainという名前のメソッドが含まれている必要があることに注意してください。
引数はどのようにメインメソッドに渡されますか
受け入れられる形式はMyConsoleApp.exe value01 value02などです。
アプリケーションは、各スペースの後に各値をパラメーター配列の個別の要素に割り当てます。
したがって、MyConsoleApp.exe value01 value02は、argsパラメーターに2つの要素があることを意味します。
[0] = "value01"
[1] = "value02"
入力値を解析して使用する方法はユーザー次第です。
これが役に立てば幸いです。
追加資料:
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("]");
}
}
すべてのマネージドexeにはエントリポイントがあり、ILDASMにコードをロードすると表示されます。エントリポイントは、見出しのCLRで指定され、次のようになります。
読み取り [〜#〜] 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();
}
}
引数はコマンドライン経由で渡すことができ、引数も指定できません。
関数を作成して渡すこともできます。この関数で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));
}
ランタイムエンジンのメインメソッドはint main(int argc, char *argv[])
のようなものです。ここで、argcは引数の数のカウントであり、argvはそれぞれへのポインターの配列です。ランタイムエンジンは、これをc#により自然な形式に変換します。
そのメインメソッドが呼び出される前は、すべてアセンブリ言語になっています。コマンドライン引数にアクセスできます(オペレーティングシステムが起動するすべてのプロセスで使用できるようにするため)が、そのアセンブリ言語は、完全なコマンドラインの単一の文字列を複数の部分文字列に変換する必要があります(空白を使用してそれらを分離する)それらをmain()に渡す準備ができています。