跟小静读CLR via C#(01)-.NET平台下代码是怎么跑起来的-阿里云开发者社区

开发者社区> 技术小胖子> 正文

跟小静读CLR via C#(01)-.NET平台下代码是怎么跑起来的

简介:
+关注继续查看

跟小静读CLR via C#(01)-.NET平台下代码是怎么跑起来的

想起前些日子去某知名电子商务公司面试的时候,问了很多我.NET程序的运行机制,当时很多比较底层的问题都没答好,发现自己的知识太皮毛了。于是决定好好学习。今天看的是代码在.NET平台体系下的执行过程,它是怎么跑起来的?


1. 源代码编译为托管模块

程序在.NET框架下运行,首先要将源代码编译为托管模块。CLR是一个可以被多种语言所使用的运行时,它的很多特性可以用于所有面向它的开发语言。微软开发了多种语言的编译器,编译时会使用相应的编译器进行语法检查器和代码分析器,在编译完成后都生成一个托管模块。

image

托管模块?

托管模块是一个需要CLR环境才能执行的标准windows PE文件,包含IL和元数据以及PE表头和CLR表头。

  • IL又叫托管代码,是编译器编译源文件后产生的指令,CLR会在运行时将IL编译成本地CPU指令。
  • 元数据实际上是一个数据表集合,用来描述托管模块中所定义和引用的内容。VS能够智能感知就得益于元数据的描述。
  • PE表头:标准Windows PE文件表头,包含文件类型(如GUI、CUI等),以及文件创建时间等信息。
  • CLR表头:包含标识托管模块的一些信息。如CLR版本号,托管模块入口点方法(main方法)以及MethodDef元数据等等。
2. 托管模块组合为程序集

一般编译器会默认将生成的托管模块生成一个程序集,CLR直接打交道的是程序集(assembly),程序集包含一个或多个托管模块,以及资源文件的逻辑组合。组合过程如下:

image

左侧为一些托管模块,在经过一些工具的处理后,生成了一个PE文件,也就是程序集。程序集中有一个清单(manifest)数据块,用来描述组成程序集的所有文件。此外,程序集还包含它所引用的程序集的信息,这就使得程序集可以实现自描述。这样CLR就直接知道了程序集所需要的所有内容,因此程序集的部署比非托管组件要容易。

3. EXE或DLL文件启动CLR运行时

程序要运行,首先确定机器是否安装.NET框架:运行,输入%windir%/system32,查看目标是否存在mscoree.dll文件(微软组建对象运行时执行引擎)。

还可以通过工具CLRVer.exe查看机器上装的所有CLR版本。

image

加载并初始化CLR的过程:

image

4. 程序集执行

IL代码要通过即时编译器(JIT)转换成本地CPU指令。

方法第一次调用过程?

  • 1. 当程序第一次运行时,会调用JITCompiler函数,它可以知道调用了那些方法,以及定义该方法的类。
  • 2. 然后JITCompiler函数在元数据中搜索该IL代码的位置,验证后转换成本地CPU指令。将指令保存在动态分配的内存中
  • 3. JITCompiler将被调用方法地址改为第2步的内存地址
  • 4. 跳转到上述代码块上执行代码
  • 5. 执行完成后返回

IL是基于堆栈的语言,而且是无类型的。IL的好处之一是提高程序的健壮性,在将IL代码转换成本地CPU指令时,CLR将执行安全验证的过程,验证失败则会抛出异常。

 

举个小例子,我们可以看出来有时候能通过编译器的检验,但是运行时还是会抛出异常。

image

再次调用该方法?

在一个程序中,我们经常反复调用同一个方法,当再次调用该方法时就不需要重复进行验证了,可以直接调用内存块中已有的本地代码,完全跳过JITCompile函数的验证和编译过程。所以同一方法只有在第一次调用时会产生一些性能损失,后续调用就可以全速进行了。

关闭程序?

由于编译器将本地代码保存在动态内存中,所以关闭程序时本地代码将发生丢失。当再次启动程序或者同时运行程序的两个实例时,JIT编译器将再次将IL代码编译为本地指令。

 

 

你也许喜欢:跟小静读CLR via C#(00)-开篇及目录





    本文转自 陈敬(Cathy) 博客园博客,原文链接:http://www.cnblogs.com/janes/archive/2011/07/01/2095587.html,如需转载请自行联系原作者



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
618的亿级流量大考,京东云靠什么交上满分答卷?
要走近并深入认识京东云,刚刚过去的「618 大考」可能是最好的观察机会。
7 0
要让Fiddler能够监控加密过后的HTTPS请求,需要执行哪些步骤?
要让Fiddler能够监控加密过后的HTTPS请求,需要执行哪些步骤?
4 0
【七天入门Go语言】Goland && Golang 的安装与配置 | 第一天
【七天入门Go语言】Goland && Golang 的安装与配置 | 第一天
3 0
将Fiddler的服务器证书导入到Java的cacerts证书库里
将Fiddler的服务器证书导入到Java的cacerts证书库里
5 0
ABAP report的递归submit和在虚拟机里再次启动另一个虚拟机
ABAP report的递归submit和在虚拟机里再次启动另一个虚拟机
3 0
使用Fiddler监控网易云笔记客户端向服务器定时发送的sync请求
使用Fiddler监控网易云笔记客户端向服务器定时发送的sync请求
6 0
180行JavaScript代码实现的小球随机移动代码
180行JavaScript代码实现的小球随机移动代码
3 0
AI专用领域之一:声音、相机陷阱用于野生动物研究和保护
在这篇文章中以两篇文章为基础,分别讨论了声音、相机陷阱(camera traps)是如何实现野生动物监测的。此外,最后一篇文章还讨论了如何利用人工智能技术辅助解决野生动物偷猎(wildlife poaching)的问题,即对偷猎者轨迹的预测问题。
5 0
飞天加速计划·高校学生在家实践 续费任务文章
通过使用阿里云ECS快速搭建一个个人机器人学习。
10 0
13262
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载