Closed7

dotnetコマンド(.NET CLI)のinfo, list-sdks, list-runtimes はどこから出力されているのか

ルアルア

dotnetコマンドにはSDKやランタイムの情報を表示するオプションがある。
この処理を調べていて、気になったことがあったのでメモ。

list-sdks オプション
C:\WINDOWS\system32>dotnet --list-sdks
5.0.103 [C:\Program Files\dotnet\sdk]
6.0.202 [C:\Program Files\dotnet\sdk]
8.0.101 [C:\Program Files\dotnet\sdk]
ルアルア

とりあえず、src/Cli/dotnetのプロジェクトに引数--infoを渡してデバッグしてみる。

デバッグ中の出力
~省略~

インストール済みの .NET ワークロード:
表示するインストール済みワークロードはありません。

そうすると、出力がインストール済みの .NET ワークロードで終了してしまう。

イントール済みのdotnetコマンドではインストール済みの .NET ワークロードの後にHostと続くが、デバッグ中はなぜか出力されない。

インストール済みの出力
~省略~

インストール済みの .NET ワークロード:
 Workload version: 8.0.100-manifests.30fce108
表示するインストール済みワークロードはありません。

Host:
  Version:      8.0.1
  Architecture: x64
  Commit:       bf5e279d92

~省略~

--list-sdks--list-runtimesに関しては出力されないどころか、helpコマンドのような結果が出力される。

ルアルア

パースされたり色々処理が挟まっている部分は割愛。
--infoオプション自体の処理はここで行われる。

https://github.com/dotnet/sdk/blob/cede2742677cf3552b29946af346660e4b99c468/src/Cli/dotnet/Program.cs#L160-L164

https://github.com/dotnet/sdk/blob/cede2742677cf3552b29946af346660e4b99c468/src/Cli/dotnet/CommandLineInfo.cs#L17-L33

PrintInfo()関数を見たら分かる通り、--infoオプションの処理はインストール済みの .NET ワークロードを出力するPrintWorkloadsInfo()関数で終わっている。

また、--list-sdks--list-runtimesは処理する場所自体存在しない。

ルアルア

では、どこから出力されているかというと、答えはhostfxrモジュール。

hostfxrについてはここに詳しく書かれている。(いい記事なので読もう!)
https://qiita.com/up-hash/items/87e98261bb026298f207#hostfxrdll

hostfxrはホストモードがmuxer(dotnetコマンドで起動された場合のモード)の時、ネイティブでオプションを処理する。

デバッグ時に--info--list-sdks--list-runtimesが通常と異なる動作をしたのはmuxerモードで起動されていなかったから。

ルアルア

--infoの処理。マネージド(dotnet.dll)を実行した後に追加でinfo情報を出力している。(command_line::print_muxer_info)

https://github.com/dotnet/runtime/blob/2a8d26b323c5f74791a45330b0ee9ef8ec83f4fe/src/native/corehost/fxr/fx_muxer.cpp#L1089-L1111

--list-sdks--list-runtimesの処理。
こちらはマネージド自体実行しない。

https://github.com/dotnet/runtime/blob/2a8d26b323c5f74791a45330b0ee9ef8ec83f4fe/src/native/corehost/fxr/fx_muxer.cpp#L1027-L1037

ルアルア

dotnet helpで以下のように表記されてるのは内部で処理が分かれているから。

dotnet help
使用法: dotnet [runtime-options] [path-to-application] [arguments]
使用法: dotnet [sdk-options] [command] [command-options] [arguments]

言われてみれば納得。

このスクラップは3ヶ月前にクローズされました