在 Windows 下,使用 .NET Framework 构建出来的应用,可以只有一个可执行文件,在可执行文件里面包含了 IL 代码。而使用 .NET Core 构建出来的应用,将会包含一个 Exe 可执行文件,和对应的 Dll 文件,而 IL 代码将放在 Dll 文件里面。那么使用 .NET Framework 和使用 .NET Core 所输出的 Exe 可执行文件有什么差别
在 dotnet core 或 dotnet 5 下,默认输出的 Exe 可执行文件是 AppHost 文件,这是一个纯 Win32 可执行文件,里面不包含 IL 代码。在用户双击运行此 Exe 可执行文件的时候,将会运行起来这个 Win32 应用,在这里面将调用起 CLR 引擎,执行放在 Dll 的 IL 代码。此部分逻辑相对复杂,详细请看 dotnet core 应用是如何跑起来的 通过AppHost理解运行过程
而在 .NET Framework 里面,根据 Managed Execution Process 官方文档 可以了解到,输出的 Exe 可执行文件里面,格式是符合 PE 格式的文件,但是在 PE 文件中包含了从元数据和 MSIL 代码。在双击可执行程序运行的时候,首先进入的 operating system loader 将会判断 PE 文件的 COFF 头内容,通过 COFF 头识别这个可执行文件是否 .NET Framework 可执行文件,也就是说 .NET Framework 生成的可执行文件是由系统进行特别支持的。此时将会加载 mscoree.dll 进行执行,通过 _CorValidateImage
和 _CorImageUnloading
分别用来通知 operating system loader 托管模块的映像的加载和卸载。其中在 _CorValidateImage
中将执行确保该代码是有效的托管代码以及将映像中的入口点更改为运行时中的入口点。而在 x64 中,还会在 _CorValidateImage
中通过在内存中修改映像的 PE32 为 PE32+ 格式。也因为 .NET Framework 应用是依靠系统的特殊处理,因此 .NET Framework 又有一个原因耦合了系统环境,这和 .NET Core 的启动有着本质的差别
文件内容的差别是:
启动的时候的差别是:
这就是 .NET Framework 和 .NET Core 启动的可执行文件的差别,以及执行的差别
现在的 .NET Framework 的运行时大部分逻辑都没有开源(我即使能通过MVP权限拿到我也不敢在这里吹)因此只能通过官方公开的文档了解到细节,而 .NET Core 是完全开源的,因此我对 .NET Core 里面的逻辑相对来说更了解。好在后续将会统一使用为完全开源的 .NET 5 以及后续版本,所以即使对 .NET Framework 的执行细节不了解,问题也许不大
关于 .NET Core 底层接地气的书籍,我推荐农夫的 《.NET Core底层入门》 这本书。而关于内存相关,我推荐伟民哥翻译的 .NET内存管理宝典 - 提高代码质量、性能和可扩展性 这本书
参考
dotnet core 应用是如何跑起来的 通过AppHost理解运行过程
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有