In .NET Core 3.1 it was a self-extracting archive; I think in .NET 5.0 the assemblies are directly mmapped from the .exe without an extraction step.
Also, you can enable some tree shaking: https://docs.microsoft.com/en-us/dotnet/core/deploying/trimm...
But tree shaking can be problematic if the application uses Reflection.