.NETランタイムの引数分割
.NETランタイムがWindowsでコマンドラインから引数配列を得る仕組み。apphostやdotnet.exeで起動した通常の構成では、ホスト自身がMSVCのCランタイムで作られたwmainのプログラムなので分割はCランタイム起動コードが行い、ホストは自分のオプションとアプリのパスを除いた残りを、アプリのパスと一緒にランタイムに渡す。ランタイムは起動時に、先頭にプログラム名(ホストから渡された起動名、無ければアセンブリのパス)を置いた配列を作ってEnvironment.GetCommandLineArgs用に保持し、Mainのargsにはプログラム名を除いた引数だけを渡す。起動時の引数を受け取らないホストされたライブラリの構成では、フォールバックとしてランタイム自身の分割コード(SegmentCommandLine)がGetCommandLineWの戻り値を分割する。この分割コードはMSVCのCランタイムの文書に合わせて実装され、CommandLineToArgvWは挙動がわずかに異なるため使っていない。ネイティブホストが独自のargc/argvを渡してMainを呼ぶ構成では、Mainのargsはホストが渡した値になる。
この概念が関わる関係
- .NETランタイムの引数分割はGetCommandLineWを利用します。
- .NETランタイムの引数分割はコマンドライン分割の規則(空白・引用符・バックスラッシュ)の実装を担います。
この概念を扱う記事
一次資料
- https://learn.microsoft.com/dotnet/api/system.environment.getcommandlineargs
- https://github.com/dotnet/runtime/blob/main/src/libraries/System.Private.CoreLib/src/System/Environment.cs
- https://github.com/dotnet/runtime/blob/main/src/libraries/System.Private.CoreLib/src/System/Environment.Windows.cs
- https://github.com/dotnet/runtime/blob/main/src/native/corehost/apphost/apphost.c
- https://github.com/dotnet/runtime/blob/main/src/native/corehost/dotnet/dotnet.cpp
- https://github.com/dotnet/runtime/blob/main/src/coreclr/vm/corhost.cpp
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。