はじめに
.NET Coreでは、ほとんどのコマンドの起点にdotnet(.exe)というものを使う。
しかし、このdotnet.exe、どこから来ているのか、coreclrやcorefxを見てもさっぱりわからなかった。
確かに、実際知らなくてもほとんど問題はないようなものではある。だが、そこは一旦気になりだすと落ち着かなくなる性分なので、色々調べてみたら、最近この辺りかなという所が見えてきたので、書いておく。
リポジトリ
簡潔に言うと、core-setupというリポジトリで管理している。
dotnetプロジェクトはどこか
さて、ではどこにdotnet.exeをビルドするプロジェクトがあるかというと、core-setup/src/corehost/cli/dotnetという場所にcmakeプロジェクトが存在していた。名前からしてこれで間違いないだろう。
実装はどこか
dotnetプロジェクトのCMakeLists.txtの他に、includeしている*.cmakeを辿っていくと、大体以下のようなファイルを読み込んでいることがわかった。
-
corehost.cpp
- main関数が存在
- fx_ver.cpp
- trace.cpp
- utils.cpp
-
pal.windows.cpp
- windowsの場合
-
longfile.windows.cpp
- windowsの場合
-
native.rc
- windowsの場合
-
pal.unix.cpp
- windows以外のOSの場合
もしかしたら他にもあるかもしれないが、大体こんなところだろう。CMakeLists.txt等を見る限りでは、ほとんど準備なしにビルドできそうに見える。
それぞれのファイルが何をしているかについては、書くと結構な分量になることが予想されるので、この記事では書かない。
終わりに
core-setupリポジトリを見てみると、self-contained-appをどのように起動しているか、あるいは、dotnet.exeがどのようにパスを解決しているか、という、今までなんとなくブラックボックスにしていた部分もなんとなく見えてくるので、時間があるときに見てみれば、より深くdotnetの内部が見えてくる、かもしれない。