在使用 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!