第一部分 CLR基础:第1章 CLR的执行模型
1.1将源代码编译成托管模块
每个面向CLR的编译器生成的都是IL(中间语言)代码,或称为托管代码,因为CLR管理它执行;另外编译器还要在每个托管模块中生成完整的元数据,元数据是一组数据表,一些数据表描述模块中定义的内容,比如类型及其成员。还有一些元数据表描述了托管模块引用的内容,比如导入的类型及其成员。
元数据作用:1.编译后可以解析元数据,才有“智能感知”。2.将对象属性序列化和反序列化。
注:CLR(Common Language Runtime)公共语言运行时 核心功能:内存管理、程序集加载、安全性、异常处理、线程同步
1.2将托管模块合并成程序集
清单是有一个或多个元数据表构成的集合,描述构成程序集的文件。
程序集是一个或多个模块/资源文件的逻辑分组。“程序集”可以将一组文件当作一个实体来对待。
1.3加载公共语言运行时
生成的程序集可以是exe文件或dll文件,最终由CLR管理执行。
1.4执行程序集的代码
可以将IL看作是一种面向对象的机器语言。
执行一个方法:IL -> CPU指令(由CLR的JIT just-in-time即使编译器的来转换)
Main方法执行前,CLR检测出Main代码引用的所有类型,分配一个内部数据结构来管理对所引用类型的访问。上图中内部结构中,Console类型定义的每个方法都有一个对应的记录项,每个记录都容纳了一个地址,根据地址可以找到方法的实现。
对这个结构进行初始化时,CLR将每个记录项都设置成(指向)包含在CLR内部的一个未文档化的函数(JITCompiler)。
Main方法首次调用WriteLine时,JITCompiler函数会被调用。JITCompiler函数负责将一个方法的IL代码编译成本地CPU指令。
JITCompiler
函数被调用时,它知道要调用的是哪个方法,以及具体是什么类型定义了该方法。然后,JITCompiler会在定义(该类型的)程序集的元数据中查找被调
用的方法的IL。接着,JITCompiler验证IL代码,并将IL代码编译成本地CPU指令。本地CPU指令被保存到一个动态分配的内存块中。然
后,JITCompiler返回CLR为类型创建的内部数据结构,找到与被调用的方法对应的那一条记录,修改最初对JITCompiler的引用,让它指
向内存块中的代码。这些代码正是WriteLine方法(获取String参数的那个)的具体实现。这些代码执行完毕并返回时,会返回到Main中的代
码,并像往常一样继续执行。
个人简化理解:CLR
检查方法中引用的类型,分配一个内部数据结构来保存对类型的访问,类型中定义的方法对应一个记录,记录指向CLR内部函数JITCompiler,方法调
用后对应的JITCompiler开始执行,找到程序集元数据中方法的IL,验证IL,转换为CPU指令并保存到动态内存中,将记录修改指向这个内存中的
代码,执行代码,返回,程序继续往下执行...
1.6 Framework类库
.NET Framework中包含了Framework类库(Framework Class Library,FCL),FCL是一组DLL程序集的统称。
1.7通用类型系统
微软制定的正式类型规范:Common Type System,CTS 它描述了类型的定义和行为。
方法签名:是否有返回值,返回值的类型;参数的类型、数量及顺序。
1.8公共语言规范
公共语言规范(Common Language Specification, CLS),任何编译器生成的类型想兼容于其他“符合CLS、面向CLR的语言”所生成的组件,就必须支持这个最小功能集。允许一种语言中使用由另一种语言创建的对象。
第一部分 CLR基础:第1章 CLR的执行模型的更多相关文章
- 第一模块·开发基础-第1章 Python基础语法
Python开发工具课前预习 01 Python全栈开发课程介绍1 02 Python全栈开发课程介绍2 03 Python全栈开发课程介绍3 04 编程语言介绍(一) 05 编程语言介绍(二)机器语 ...
- 第一部分 CLR基础:第3章 共享程序集和强命名程序集
第一部分 CLR基础:第3章 共享程序集和强命名程序集
- 第一章 CLR 的执行模型
CLR via C# 读书笔记:第一章 CLR 的执行模型(1) 第Ⅰ部分CLR基础.这部分为三章(第一章:CLR的只想能够模型,第二章:生成.打包.部署和管理应用程序及类型,第三章:共享程序集和强命 ...
- 第一章 CLR执行模型
发现看过好几遍还是会忘记,因水平有限理解的不是很到位.欢迎各位大神及时指正. CLR执行模型 1.1编译器将源代码编译成托管模块 托管模块:是标准的windows可移植执行体文件(PE32(32位机器 ...
- CLR基础之一---认识CLR [《CLR via C#》读书笔记]
<CLR via C#>读书笔记 什么是CLR CLR的基本概念 通用语言运行平台(Common Language Runtime,简称CLR)是微软为他们的.Net虚拟机所选用的名称.这 ...
- Windbg CLR基础小测 《第六篇》
首先写一段代码如下: namespace ConsoleApplication3 { class Program { static void Main(string[] args) { Console ...
- 01.由浅入深学习.NET CLR 基础系列之CLR 的执行模型
.Net 从代码生成到执行,这中间的一些列过程是一个有别于其他的新技术新概念,那么这是一个什么样的过程呢,有什么样的机制呢,清楚了这些基本的东西我们做.Net的东西方可心中有数.那么,CLR的执行模型 ...
- 第1章 CLR的执行模型
1.1将源代码编译成托管代码模块
- 第22章 CLR寄宿和AppDomain
22.1 CLR寄宿 CLR Hosting(CLR 宿主)的概念:初始启动.Net Application时,Windows进程的执行和初始化跟传统的Win32程序是一样的,执行的还是非托管代码,只 ...
- CLR基础,CLR运行过程,使用dos命令创建、编译、运行C#文件,查看IL代码
CLR是Common Language Runtime的缩写,是.NET程序集或可执行程序运行的一个虚拟环境.CLR用于管理托管代码,但是它本身是由非托管代码编写的,并不是一个包含了托管代码的程序集, ...
随机推荐
- jdk之jhat命令
jhat命令 -- JavaHeap Analyse Tool 用途:是用来分析Java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言第一步:导出堆 ...
- 浅析JAVA_HOME,CLASSPATH和PATH的作用
1,设置JAVA_HOME: java的目录一.为了方便引用,比如,你JDK安装在C:\ProgramFiles\Java\jdk1.7.0目录里,则设置JAVA_HOME为该目录路径, 那么以后你 ...
- Django – query not equal
The simpliest way to retrieve data from tables is take them all. To do this, you can write: 1 all_e ...
- 2015 ACM/ICPC Asia Regional Beijing Online
时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 You must have seen the very famous movie series,"Mission ...
- Spring 配置文件详解 http://www.blogjava.net/hellxoul/archive/2011/11/19/364324.html
1.基本配置: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http: ...
- UltraEdit 除去行首的行号和空格
我们在复制代码的时候,经常会发生这种事情. 例如:如下文件(lpc17xx_libcfg.h) 00001 /********************************************* ...
- cocos2d-lua 3.5 ios搭建步骤
xcode搭建cocos2d-lua是最简单的,不用 配置一系列环境变量,只把xcode安装好就可以 步骤一:去官网下载quick-3.5,然后打开命令行工具 步骤二:cd进入/Users/song/ ...
- 在解决方案中所使用 NuGet 管理软件包依赖
使用程序包恢复功能可以在提交源代码时, 不需要将代码库提交到源代码管理中,大幅减少项目的尺寸.所有NuGet程序包都存储在解决方案的Packages文件夹中. 要启用程序包恢复功能,可右键单击解决方案 ...
- (二). 细说Kalman滤波:The Kalman Filter
本文为原创文章,转载请注明出处,http://www.cnblogs.com/ycwang16/p/5999034.html 前面介绍了Bayes滤波方法,我们接下来详细说说Kalman滤波器.虽然K ...
- SQL增加,删除,更改表中字段
1. 向表中添加新的字段 alter table table_name add column_name varchar2(20) not null 2. 删除表中的一个字段 delete t ...