01.由浅入深学习.NET CLR 基础系列之CLR 的执行模型

.Net 从代码生成到执行,这中间的一些列过程是一个有别于其他的新技术新概念,那么这是一个什么样的过程呢,有什么样的机制呢,清楚了这些基本的东西我们做.Net的东西方可心中有数。那么,CLR的执行模型是一个什么样的过程呢?

将源代码编译成托管模块 --> 将托管模块合并成程序集 --> 加载公共语言运行时 --> 执行程序集的代码

目录
  • 将源代码编译成托管模块

  • 将托管模块合并成程序集
  • 加载公共语言运行时
  • 执行程序集的代码
  • 本地代码生成器:NGen.exe
  • Framwork类库入门
  • 通用类型系统
  • 公共语言规范(CLS)
  • 与非托管代码的互操作性 
将源代码编译成托管模块

首先.Net开发是支持多语言选择或者混合语言编程的,代码的编译是采用编译器面向CLR的机制,即,无论何种语言编写的代码,只要采用的编译器是面向CLR的就可以了。

Common Language Runtime:公共语言运行时,可由多种编程语言使用的"运行时"。CLR的核心功能(比如内存管理,程序集加载,安全性,异常处理和线程同步)可由面向CLR的所有语言使用。

Managed module:托管模块,即编译器编译的结果都是一个托管模块。

IL:每个面向CLR的编译器生成的都是IL(中间语言)代码。也成为托管代码,因为CLR要管理它的执行。

Native code compiler:本地代码编译器。生成的是面向特定CPU架构(X86、X64、IA64)的代码。

Metadata:元数据。是一种数据表,其中一些数据描述了模块中定义的内容,比如类型和成员;还有些数据描述了模块引用的内容,比如导入的类型及其成员。元数据总是和包含IL代码的文件关联,永远是同步的。

将托管模块合并成程序集

上图显示了托管模块合并成程序集的过程。

程序集(assembly)的理解:一个或者多个模块/资源文件的逻辑性分组;程序集是重用、安全性、版本控制的最小单元。

从上图显示可看出程序集(assembly)包含一个名为"清单"(manifest)的数据块,它是由元数据表构成的另一种集合,描述了构成程序集的文件。

另一个地方就是AL.exe:程序集连接器

加载公共语言运行时

Windows 检查EXE文件头:

PE32:需要32位地址空间,可在32位/64位地址空间中运行

PE32+:需要64位地址空间

CPU架构信息,确保当前CPU是符合要求的

创建32/64/WoW64位进程 :根据exe文件头创建的

加载MSCorEE.dll: 该文件在C:\Windows\SysWow64 或 C:\Windwos\Sys

看上面的流程还是比较清晰的。

执行程序集的代码

为了执行一个方法,首先必须把它的IL转换成本地的CPU指令。这是CLR的JIT(just-in-time或者"即时")编译器的职责。从示意图来分析其过程是如何的。

  1. Mian()执行之前,CLR先检测出Main的代码所引用的所有类型.

  2. 分配内部数据结构,用于管理所引用类型的访问,如图Console类型,Console类型定义的每一个方法都有一个对应的entry(记录项)。每个entry都容纳了一个地址,根据此地址即可找到方法的实现.对这个结构进行初始化时,CLR将每个记录项都设置成(指向)包含在CLR内部的一个未文档化的函数,这个函数即为JITCompiler
  3. Main函数首次调用WriteLine时,JITCompiler函数会被调用。

    JITCompiler 函数调用时,JITCompiler在定义该类型的程序集的元数据中查找被调用方法的IL

    -->验证IL

    -->编译成本地CPU指令

    -->返回到刚才的记录,并修改对JITCompiler的引用,指向刚才编译的内存块的地址

    -->JITCompiler函数跳转到刚才的内存块执行

    -->返回到Mian继续执行

  4. Main函数第二次调用WriteLine时

本地代码生成器:NGen.exe

NGen.exe:.NET Framework 提供的工具,可以在一个应用程序安装到目标计算机上时,将IL代码编译成本地代码。

NGen.exe终于作用:

  1. 加快应用程序的启动速度

  2. 减少应用程序的工作集(working Set)

位置:类似C:\Windows\Microsoft.NET\Framework\v4.0.30319

命令语法:

ngen <action> [options]

ngen /? | /help

Framework类库

FCL:Framework Class Library 是一组DLL程序集的统称。

通用类型系统

CTS:Common Type System,它描述了类型的定义和行为。

公共语言规范

CLS:Common Language Specification

相信混合语言的编程才迫使微软制定了CLS。CLS解决的问题是使用不同的语言创建的对象能够相互通信。要创建很容易从其他语言中访问的类型,只能从自己的编程语言中挑选其他语言都确定支持的那些功能。

这就要求任何编译器生成的类型要想兼容于由其他"符合CLS、面向CLR的语言"所生成的组件,就必须支持这个最小功能集。

告诉编译器需要检查CLS兼容性的语法

[assembly:CLSCompliant(true)]

namespace SomeLibrary

{

}

与非托管代码的互操作性

为了迎合之前的非托管代码的用户,微软通过CLR提供了一些机制,允许应用程序中同时包含托管和非托管代码。

  1. 托管代码能调用DLL中的非托管函数

  2. 托管代码可使用现有的COM组件(服务器)
  3. 非托管代码可使用托管类型(服务器)

本文还是主要学习了一些.NET平台设计的一些架构思想和概念,应该在整体上对.NET有一个基本的认识。

时间: 2024-08-03 08:10:29

01.由浅入深学习.NET CLR 基础系列之CLR 的执行模型的相关文章

由浅入深学习.NET CLR 系列:目录

经过对Android的一阵折腾,些许熟悉了一些Java的东东,又开始转战.NET.我觉得学习最好和工作不要相离太远,才会更加随笔随意,索性整理一些比较系统的.NET的基础知识学习学习.一提起学习.NET,最经典莫过于CLR via C#了,既然奉为经典,那就从这里开始吧.据此初步整理出如下目录来: 由浅入深学习.NET CLR 基础系列 CLR 的执行模型 生成.打包.部署和管理应用程序及类型 共享程序集和强命名程序集 由浅入深学习.NET CLR 设计类型 类型基础 基元类型.引用类型和值类型

JavaScript基础系列目录(2014.06.01~2014.06.08)

下列文章,转载请亲注明链接出处,谢谢! 链接地址: http://www.cnblogs.com/ttcc/tag/JavaScript%20%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86%20%E6%80%BB%E7%BB%93/ 1. Javascript基础---语法(待完成) 2. JavaScript基础---数据类型(待完成) 3. JavaScript基础---Array数组(待完成) 4. JavaScript基础---正则表达式(待完成) 5. Jav

01-Python学习笔记-基础语法

Python标识符 -d           在解析时显示调试信息 -O           生成优化代码 ( .pyo 文件 ) -S           启动时不引入查找Python路径的位置 -v            输出Python版本号 -X           从 1.6版本之后基于内建的异常(仅仅用于字符串)已过时. -c cmd     执行 Python 脚本,并将运行结果作为 cmd 字符串. file           在给定的python文件执行python脚本. P

【慕课网】php工程师学习计划之我的学习笔记——01 入门必学web基础 htmlcss基础课程 篇

为了进一步学习PHP,本周我选定了慕课网的PHP工程师学习计划, 从今天2015-07-06 10:24:47开始从头学习:计划本周尽快学习完成本课程,谨此作为笔记. 有个好的学习计划和思路非常非常重要,非常感谢慕课网提供本套学习计划,希望更多地学习平台能提供像这样全面一条龙学习思路清晰地教程. 计划图:链接 我的学习状况:2015-07-06 10:29:46 开始随记: php工程师学习计划笔记——01 入门必学web基础 htmlcss基础课程 篇 入门篇: text-align:cent

J2EE开发实战基础系列一 HelloWorld

开始咱们的第一个程序,首先是配置环境,按照上一章所描述的方式下载开发工具,然后配置Java环境变量,给大家看下具体的结构: 环境变量配置OK的提示,如上图. Eclipse和Tomcat的文件目录位置,本系列采用的都是绿色版本,如上图. 启动Eclipse.exe,Workspace路径的配置,下面的复选框表示选中后就默认一直使用该工作空间,不选择每次启动都出出现该提示框,如上图. 在这里讲解下Workspace的概念,这里目录存储项目程序段的,假如你在别的目录创建一个Java的项目,那么在Wo

J2EE开发实战基础系列一 HelloWorld【转】

开始咱们的第一个程序,首先是配置环境,按照上一章所描述的方式下载开发工具,然后配置Java环境变量,给大家看下具体的结构: 环境变量配置OK的提示,如上图. Eclipse和Tomcat的文件目录位置,本系列采用的都是绿色版本,如上图. 启动Eclipse.exe,Workspace路径的配置,下面的复选框表示选中后就默认一直使用该工作空间,不选择每次启动都出出现该提示框,如上图. 在这里讲解下Workspace的概念,这里目录存储项目程序段的,假如你在别的目录创建一个Java的项目,那么在Wo

贝叶斯公式由浅入深大讲解—AI基础算法入门

1 贝叶斯方法 长久以来,人们对一件事情发生或不发生的概率,只有固定的0和1,即要么发生,要么不发生,从来不会去考虑某件事情发生的概率有多大,不发生的概率又是多大.而且概率虽然未知,但最起码是一个确定的值.比如如果问那时的人们一个问题:"有一个袋子,里面装着若干个白球和黑球,请问从袋子中取得白球的概率是多少?"他们会想都不用想,会立马告诉你,取出白球的概率就是1/2,要么取到白球,要么取不到白球,即θ只能有一个值,而且不论你取了多少次,取得白球的概率θ始终都是1/2,即不随观察结果X

ROS 学习系列 -- 使用urdf创建机器人模型在Rviz中3D观察 之一 joint 使用

我们接着上文  ROS 学习系列 -- 使用urdf创建机器人模型在Rviz中3D观察 之一 link使用继续完成创建带四个可以转动轮子的双层小车. 一 建立可以转动的joint <span style="font-size:18px;"><?xml version="1.0"?> <robot name="sp1s"> <link name="base_link"> <v

学习Hadoop不错的系列文章

1)Hadoop学习总结 (1)HDFS简介 (2)HDFS读写过程解析 (3)Map-Reduce入门 (4)Map-Reduce的过程解析 (5)Hadoop的运行痕迹 (6)Apache Hadoop 版本 2)Hadoop-0.20.0源代码分析 (1)Hadoop-0.20.0源代码分析(01) 地址:http://blog.csdn.net/shirdrn/article/details/4569702 (2)Hadoop-0.20.0源代码分析(02) 地址:http://blog