BTW One thing I've always liked about dotnet is the binary is an executable and you run that not the interpreter/vm process. When you look at list of prcesses running you see your process, not java or python.
On windows the dotnet runtime is so ubiquitous I'm a bit surprised this is needed.
It's not just the runtime, but dependent assemblies too.
E.g. I have one app that has 4 aseemblies (the program + 3 internal libraries), 5 more "internal" general assemblies/libraries of mine, and 12 dependencies from nuget, for a grand total of 21 (+ 1 wrapper .exe) files. Now double that number if you want the pdbs (debug/symbol files) too. Without the runtime.
Shipping 21 files isn't horrible (I have seen node_modules directories in the hundreds of thousands of files), but shipping one single self-contained .exe would be even nicer.
You can kinda use IlMerge (and some hacking) to achieve a similar result, but it can break in subtle ways (especially when you try to debug something) and does not work with netcore as far as I know. And it's not officially supported either.
On windows the dotnet runtime is so ubiquitous I'm a bit surprised this is needed.