Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >dotnet core 和 dotnet Framework 启动可执行文件的差别

dotnet core 和 dotnet Framework 启动可执行文件的差别

作者头像
林德熙
发布于 2021-01-18 02:48:41
发布于 2021-01-18 02:48:41
7530
举报
文章被收录于专栏:林德熙的博客林德熙的博客

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 Core: 纯 Win32 的 PE 格式文件,不包含 IL 逻辑。包含 IL 逻辑的放在额外的 Dll 文件
  • .NET Framework: 稍微特殊的 Win32 的 PE 格式文件,包含了特殊 COFF 头内容用来标识这是 .NET Framework 文件。在 PE 格式文件里面包含了 IL 逻辑

启动的时候的差别是:

  • .NET Core: 作为传统的 Win32 应用启动,在启动过程中加载 CLR 引擎,然后通过 CLR 引擎执行 IL 逻辑
  • .NET Framework: 由系统根据 COFF 头判断这是 .NET Framework 应用,通过特殊手段启动,使用系统的 mscoree.dll 进行初始化

这就是 .NET Framework 和 .NET Core 启动的可执行文件的差别,以及执行的差别

现在的 .NET Framework 的运行时大部分逻辑都没有开源(我即使能通过MVP权限拿到我也不敢在这里吹)因此只能通过官方公开的文档了解到细节,而 .NET Core 是完全开源的,因此我对 .NET Core 里面的逻辑相对来说更了解。好在后续将会统一使用为完全开源的 .NET 5 以及后续版本,所以即使对 .NET Framework 的执行细节不了解,问题也许不大

关于 .NET Core 底层接地气的书籍,我推荐农夫的 《.NET Core底层入门》 这本书。而关于内存相关,我推荐伟民哥翻译的 .NET内存管理宝典 - 提高代码质量、性能和可扩展性 这本书

参考

dotnet core 应用是如何跑起来的 通过AppHost理解运行过程

dotnet core 应用是如何跑起来的 通过自己写一个 dotnet host 理解运行过程

Managed Execution Process

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
.NET5.0 单文件发布打包操作深度剖析
随着 .NET5.0 Preview 8 的发布,许多新功能正在被社区成员一一探索;这其中就包含了“单文件发布”这个炫酷的功能,实际上,这也是社区一直以来的呼声,从 WinForm 的 msi 开始,我们就希望有这样一个功能,虽然在 docker 时代,单文件发布的功能显得“不那么重要”,但正是从这一点可以看出,.NET 的团队成员一直在致力于实用功能的完善。
梁规晓
2020/09/10
1.2K0
.NET5.0 单文件发布打包操作深度剖析
[re入门]PE文件小知识
那是一个沙尘暴都能上热搜的清晨,我揉了揉眼睛从床上爬起来,顶着一路的艰难险阻来到了实验室,开机,hello 酷狗,登录PC微信,蓝屏。全剧终。
李鹏华
2024/03/12
1850
[re入门]PE文件小知识
你的C#代码是怎么跑起来的(一)
用户1147588
2018/01/04
1.2K0
你的C#代码是怎么跑起来的(一)
dotnet core 应用是如何跑起来的 通过自己写一个 dotnet host 理解运行过程
在上一篇博客是使用官方提供的 AppHost 跑起来整个 dotnet 程序。本文告诉大家在 dotnet 程序运行到托管代码之前,所需要的 Native 部分的逻辑。包括如何寻找 dotnet 运行时,如何加载运行时和框架然后跑起来业务端的 dll 文件的逻辑
林德熙
2020/12/08
5660
dotnet core 应用是如何跑起来的 通过自己写一个 dotnet host 理解运行过程
再说String
在前两个月的时间内,我在园子里发表的两片介绍字符串的恒定性和字符串驻留的文章:《字符串的驻留(String Interning)》和《深入理解string和如何高效地使用string》。前几天Anytao在他的《品味类型---值类型与引用类型(中)-规则无边》的文章中,针对字符串的恒定性展开了很好的讨论,昨天首页上又出现了亚历山大同志的讨论性质的帖子《关于String的终极解释》。大家已经讨论得很完备了,在这里我只是根据我自己的理解对此作一些补充。
蒋金楠
2022/05/09
3500
.NET Core全面扫盲贴
标签: .NETCore Asp.NETCore 1. 前言 .NET发行至今已经过了十四个年头。随着版本的不断迭代更新,.NET在Windows平台上的表现也是越来越好,可以说Windows平台上所有的应用类型.NET几乎都能完成。 只是成也Windows,败也Windows,这十四年来,除了部分“民间”版本,.NET一直没能在官方支持下摆脱Windows平台的局限,“开源”和“跨平台”这两个词语也是所有.NET开发者心中的痛楚。最终,.NET Core出现了,它让开发者们在官方和社区的支持走出了Wind
潘成涛
2018/01/18
1.8K0
.NET Core全面扫盲贴
探索 dotnet core 为何在 Windows7 系统需要补丁的原因
在一些 Windows 7 系统上,根据 dotnet 官方文档,需要安装上 KB2533623 补丁,才能运行 dotnet core 或 .NET 5 等应用。尽管非所有的设备都需要安装此,但这也让应用的分发不便,安装包上都需要带上补丁给用户安装。此补丁同时也要求安装完成之后重启系统,这对用户端来说,也是较不方便。本文来聊聊为什么 dotnet core 一系的框架依赖于此补丁
林德熙
2021/12/28
2.5K0
探索 dotnet core 为何在 Windows7 系统需要补丁的原因
PublishFolderCleaner 让.NET 应用发布文件夹更加整洁
链接:cnblogs.com/lindexi/archive/2021/10/19/15423277.html
郑子铭
2021/11/10
4310
dotnet 桌面端基于 AppHost 的配置式自动切换更新后的应用程序路径
在桌面应用端开发的时候,应用更新有很多实现方式,本文来告诉大家一个基于 dotnet core 或 .NET 5 的 AppHost 方式的配置式软件更新方法。这个方法的特点是入口的 Exe 文件可以固定不动,每次更新的时候只需要更新某个配置文件的路径,即可实现在应用启动的时候,读取配置文件的路径加载某个版本的软件跑起来。而且本文的方法不需要额外其他一个独立的启动进程,而是入口文件进程就是最终的 dotnet 进程,可以做到固定到任务栏等不会在自动更新的时候丢失
林德熙
2021/04/08
7120
推荐官方开源 PInvoke 库 包含大量 win32 封装
在调用 win32 库的时候,小伙伴会遇到的问题是不知道对应的 win32 函数应该如何写。或者在网上抄了的代码的实现都有些诡异,想要自己封装发现工作量太大。好消息是官方将 PInvoke 库在 dotnet 基金会完全开源,包含了大量的 Win32 库,如 gdi32.dll 和 kernel32.dll 和 user32.dll 等
林德熙
2020/07/28
1.4K0
PublishFolderCleaner 让你的 dotnet 应用发布文件夹更加整洁
大家都知道,在 dotnet 发布时,将会在输出的 publish 文件夹包含所需的依赖。在 .NET Core 开始,引入了 AppHost 的概念,即使是单个程序集,也需要独立的 Exe 可执行文件带上实际包含 Main 函数的 dll 文件。特别是进行独立发布的时候,输出文件夹上有超级多个文件,看起来不清真。本文来告诉大家如何使用 PublishFolderCleaner 工具让发布文件夹只留一个 Exe 和一个 Lib 文件夹
林德熙
2021/10/20
9510
苏州 开源自主的 dotnet 生态
本文仅仅只是用来在2020苏州开发者大会上的素材,开发者大会成功完成,本文也可以公开
林德熙
2021/12/24
1K0
.Net托管世界的应用程序域和线程-网摘
.Net框架提供了全新的计算平台,给出了一致性的面向对象的编程环境,解决了安全、版本控制等原来系统平台中存在的问题,通过 公用语言运行库(CLR)提供了一个高效、安全的程序执行环境,也就是托管(也称作受控,Managed)环境。在这个类似虚拟机环境下,我们编写的程序 是如何运行、如何“托管”的呢?这个托管的世界如何同非托管的世界相互联系呢?
jack.yang
2025/04/05
870
.NET 高级调试:CLR和Windows加载器及应用程序域
.NET 高级调试的第二篇文章,第一篇文章《.NET 高级调试:认识调试工具》记录了自己学习 Net 高级调试的第一步,认识一些调试工具,有了工具的倚仗,我们开始仗剑走天涯了,开始Net高级调试正式的征程了。
郑子铭
2023/11/06
4640
.NET 高级调试:CLR和Windows加载器及应用程序域
【.NET】UnpackMe!Shielden+DNGuard,双层变异壳 - 脱壳详解
前言:自从脱壳神器de4dot横空出世以来,我们可以看到几乎所有的.net破文中的第一部分就是不管三七二十一把程序丢进去脱壳以及反混淆。可是你真的明白de4dot背后做了些什么吗?你对.net文件格式真的了解吗?如果这么好的开源工具大家都不去研究代码,实在是令人惋惜,以至于还在有人在论坛询问 Reactor最新版怎么脱的问题,也有的在论坛上断言MaxtoCode可以难倒99%的人……我想善于从基础学起,善于研究大神源码,真正搞懂de4dot背后所做的工作,那么这些问题都不算什么问题。这篇文章有点长,希望你能
逸鹏
2018/04/09
9.4K0
【.NET】UnpackMe!Shielden+DNGuard,双层变异壳 - 脱壳详解
通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?
什么是.NET?什么是.NET Framework?本文将从上往下,循序渐进的介绍一系列相关.NET的概念,先从类型系统开始讲起,我将通过跨语言操作这个例子来逐渐引入一系列.NET的相关概念,这主要包
小曾看世界
2018/08/03
4.8K0
通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?
记将一个大型客户端应用项目迁移到 dotnet 6 的经验和决策
在经过了两年的准备,以及迁移了几个应用项目积累了让我有信心的经验之后,我最近在开始将团队里面最大的一个项目,从 .NET Framework 4.5 迁移到 .NET 6 上。这是一个从 2016 时开始开发,最多有 50 多位开发者参与,代码的 MR 数量过万,而且整个团队没有一个人能说清楚项目里面的所有功能。此项目引用了团队内部的大量的基础库,有很多基础库长年不活跃。此应用项目当前也有近千万的用户量,迁移的过程也需要准备很多补救方法。如此复杂的一个项目,自然需要用到很多黑科技才能完成到 .NET 6 的落地。本文将告诉大家这个过程里,我踩到的坑,以及学到的知识,和为什么会如此做
林德熙
2022/08/12
1.7K0
记将一个大型客户端应用项目迁移到 dotnet 6 的经验和决策
四种方法获取可执行程序的文件路径(.NET Core / .NET Framework)
本文介绍四种不同的获取可执行程序文件路径的方法。适用于 .NET Core 以及 .NET Framework。
walterlv
2020/02/10
7K0
[re入门]PE文件结构
EXE和DLL文件之间的区别完全是语义上的,他们使用完全相同的PE格式。唯一的区别就是用一个字段标识出这个文件是EXE还是DLL。还有许多DLL的扩展,如OCX控件和控制面板程序(.CPL文件)等都是DLL,它们有一样的实体。
李鹏华
2024/03/12
3090
[re入门]PE文件结构
dotnet core 应用是如何跑起来的 通过AppHost理解运行过程
在 dotnet 的输出路径里面,可以看到有一个有趣的可执行文件,这个可执行文件是如何在框架发布和独立发布的时候,找到 dotnet 程序的运行时的,这个可执行文件里面包含了哪些内容
林德熙
2020/12/03
9830
dotnet core 应用是如何跑起来的 通过AppHost理解运行过程
推荐阅读
相关推荐
.NET5.0 单文件发布打包操作深度剖析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档