在使用 dotnet 8.0 創建一個 C# console app后,執行完編譯操作,會發現除了生成可執行文件外,還生成一個 dll文件。
$ls
ConsoleApp1 ConsoleApp1.dll ConsoleApp1.runtimeconfig.json
ConsoleApp1.deps.json ConsoleApp1.pdb
$ file ConsoleApp1
ConsoleApp1: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=bf7702fd9cd2edf0452d7e804bf305b1ea8b0f21, stripped
$ file ConsoleApp1.dll
ConsoleApp1.dll: PE32 executable (console) Intel 80386 Mono/.Net assembly, for MS Windows, 3 sections
可執行文件是一個app host, 它是一個native binary; dll文件則是一個 managed app, 可以用 dotnet ConsoleApp1.dll 執行。執行 可執行文件的時候,內部會調用 dll.
$ ./ConsoleApp1
hello, world
$ dotnet ConsoleApp1.dll
hello, world
?如果按照如下的方式執行,則會輸出一個執行加載過程的日志文件:
$ COREHOST_TRACE=1 COREHOST_TRACEFILE=out.txt ./ConsoleApp1
日志文件開頭的一部分如下:
Tracing enabled @ Wed Jul 9 16:16:59 2025 GMT
--- Invoked apphost [version: 8.0.17 @Commit: 77545d6fd5ca79bc08198fd6d8037c14843f14ad] main = {
./ConsoleApp1
}
The managed DLL bound to this executable is: 'ConsoleApp1.dll'
Looking for architecture-specific install_location file in '/etc/dotnet/install_location_x64'.
Found registered install location '/usr/lib/dotnet'.
Using global installation location [/usr/lib/dotnet] as runtime location.
Reading fx resolver directory=[/usr/lib/dotnet/host/fxr]
Considering fxr version=[8.0.17]...
Detected latest fxr version=[/usr/lib/dotnet/host/fxr/8.0.17]...
Resolved fxr [/usr/lib/dotnet/host/fxr/8.0.17/libhostfxr.so]...
Invoking fx resolver [/usr/lib/dotnet/host/fxr/8.0.17/libhostfxr.so] hostfxr_main_startupinfo
參考:
Anatomy of a .NET app
How the dotnet CLI tooling runs your code · Performance is a Feature!