发现看过好几遍还是会忘记,因水平有限理解的不是很到位。欢迎各位大神及时指正。

CLR执行模型

1.1编译器将源代码编译成托管模块

托管模块:是标准的windows可移植执行体文件(PE32(32位机器),或者PE32+(64位机器))它们需要CLR 才能执行

1.2 编译器将托管模块合并成程序集

托管模块有四个概念:

  1. PE32,PE32+文件 文件头
  2. CLR头 :标识了要求的CLR版本、标识、托管模块入口方法
  3. 元数据 :数据表集合,一方面描述了模块定义的东东,另外一方面描述了引用的一些东东。东东=类型和成员。(编译器智能感知的数据来源)
  4. IL代码(中间语言)运行时候将IL代码转化为本机cpu指令

多个托管模块合并成程序集

1.3 加载公共语言运行时(CLR)(双击可运行程序时候加载)

电脑上安装了.NET Framework。打开exe程序的时候,windows系统检查EXE文件头,决定加载64还是32位的MSCorEE.dll,进程的主线程调用MSCorEE.dll 的一个方法,这个方法会初始化CLR,再加载exe程序集,然后调用exe的入口方法即main函数。随即托管应用程序启动并且运行。

CLR的核心功能:

内存管理、程序集加载、安全性、异常处理和多线程

因此面向CLR编程的所有语言都具有以上特性

1.4执行程序集的代码

执行过程:运行可执行文件时候,先是FrameWork 初始化了CLR,CLR有托管模块的入口方法。执行exe之前CLR做如下几件事情:

  1. 检测你的方法种引用的所有类型,检查之后分配一个内部结构来管理这些被引用的类型。每个类型定义的所有方法,重点(每个类型的所有方法)都有一个对应项,每个对应项都有一个地址,根据地址就能找到方法的实现。
  2. 初始化刚才的那个结构时候每个记录项呢都会被设置成包含在CLR内部的未编档函数(成为JITCompiler),方法内部每个方法被首次调用时候发生了如图的事情。

  1. 第二次执行时候下图:第二次去执行Writeline函数呢?此时内部结构中Writeline函数入口的地址指向的已经是编译好的CPU指令的地址了,所以也就不会去执行JITCompiler这个函数。

第一章 CLR执行模型的更多相关文章

  1. 第一章 CLR 的执行模型

    CLR via C# 读书笔记:第一章 CLR 的执行模型(1) 第Ⅰ部分CLR基础.这部分为三章(第一章:CLR的只想能够模型,第二章:生成.打包.部署和管理应用程序及类型,第三章:共享程序集和强命 ...

  2. CLR执行模型与常见的几个概念

    CLR执行模型与常见的几个概念 一.CLR执行模型 1.1从代码到程序集 CLR执行的模型是从代码开始,经过编译器生成托管模块,默认情况下可以让多个托管模块和资源生成程序集.下图为其大致过程. 1.2 ...

  3. CLR执行模型

    好好学习底层运行机制,从CLR via C# 开始. CLR的执行模型: CLR:Common Language Runtime,是一个可由多种编程语言使用的"运行时".CLR的核 ...

  4. 第一章 CLR的执行模型

    编译器将源代码编译为托管模块.托管木块包含: PE32或PE32+头 CLR头 元数据 IL(中间语言)代码 PE32头的文件可在32或64位的电脑上运行,PE32+的只能在64上运行.Window6 ...

  5. 《CLR via C#》读书笔记(1)CLR执行模型

    1.1 释义 CLR 公共语音运行时 Common Language Runtime CTS 通用类型系统 Common Type System CTS.CLS是CLR的核心 CLS 通用语言规范 C ...

  6. CLR执行模型 流程总结(图)

    如有错误,还望指出:

  7. CLR 的执行模型(2)

    第一章 CLR 的执行模型(2) 本篇内容大纲 Framework 类库(Framework Class Library , FCL) 通用类型系统(Common Type System,CTS) 公 ...

  8. matlab数学实验--第一章

    一.            数据和变量: 省略号(三个英文句点):表示换行 历史指令调用:用方向键上下 数据显示格式:                    format short          ...

  9. [Clr via C#读书笔记]Cp1CLR执行模型

    Cp1CLR执行模型 本章的概念点 CLR=Common Language Runtime 内存管理,程序集加载,安全性,异常处理和线程同步.CLR是基础,支持着面向它的各种语言.各种语言会被对应的编 ...

随机推荐

  1. 列表(list) ----python

    Python 列表(List) 序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. Python有6个序列的内置类型 ...

  2. .NET高性能编程 - C#如何安全、高效地玩转任何种类的内存之Span的本质(一)。

    前言 作为.net程序员,使用过指针,写过不安全代码吗? 为什么要使用指针,什么时候需要使用它,以及如何安全.高效地使用它? 如果能很好地回答这几个问题,那么就能很好地理解今天了主题了.C#构建了一个 ...

  3. JAVA使用POI获取Excel的列数与行数

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能. 下面这篇文章给大家介 ...

  4. 10位时间戳使用moment转化为日期

    前情提要: 需要把后台传过来的10位时间戳转化格式为:‘YYYY-MM-DD HH:mm:ss’的日期展示在页面上.本来是自己写了个函数,但是奈何leader说我们项目用了moment了,你为什么不用 ...

  5. [Swift]LeetCode1033. 移动石子直到连续 | Moving Stones Until Consecutive

    Three stones are on a number line at positions a, b, and c. Each turn, let's say the stones are curr ...

  6. linux服务器 jboss-7安装

    jBoss简介 JBoss是一个运行EJB的J2EE应用服务器.它是开放源代码的项目,遵循最新的J2EE规范.从JBoss项目开始至今,它已经从一个EJB容器发展成为一个基于的J2EE的一个web 操 ...

  7. 【TensorFlow基础】tf.add 和 tf.nn.bias_add 的区别

    1. tf.add(x,  y, name) Args: x: A `Tensor`. Must be one of the following types: `bfloat16`, `half`, ...

  8. final 关键字与安全发布 多线程中篇(十三)

    final的通常理解 在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量) 大家应该都知道final表示最终的.最后的含义,也就是不能在继续 修饰类表示不能继承,修饰方法 ...

  9. 《前端之路》之 Javascript 模块化管理的来世今生

    目录 第二章 - 04: Javascript 模块化管理的来世今生 一.什么是模块化开发 1-1.模块化第一阶段 1-2.封装到对象 1-3. 对象的优化 二.模块化管理的发展历程 2-1.Comm ...

  10. Python调用ansible API系列(三)带有callback的执行adhoc和playbook

    在第二篇文章中虽然可以执行adhoc和playbook但是执行结果的输出并不是特别直观,虽然没有报错但是到底什么结果其实你是不知道的尤其是在执行adhoc的时候,这时候我们要利用callback来设置 ...