我们都知道,C#程序需要在 .NET Framework 的环境中运行。

一、程序运行所需的三个关键

  1、IL(中间语言):编译器编译源代码时生成的代码。

  2、 Framework类库(Framework Class Library,FCL):FCL是一组DLL程序集的统称,其中包含数千个类型定义和功能。

  3、CLR(公共语言运行时,Common Language Runtime):它和Java虚拟机一样也是一个运行时环境,是一个可由多种编程语言使用的运行环境。CLR的核心功能包括:内存管理、程序集加载、安全性、异常处理和线程同步,可由面向CLR的所有语言使用。并保证应用和底层操作系统之间必要的分离。CLR是.NET Framework的主要执行引擎。

  注:.NET Framework 中包含了Framework类库(Framework Class Library,FCL)和 CLR(公共语言运行时,Common Language Runtime)。

二、将源代码编译成托管代码

  将源代码编译成托管模块,就是本地代码编译器根据机器的CPU架构(比如X86,X64或IA64)编译生成IL(中间代码)的过程。IL是托管代码,需要CLR来管理它的执行。因此就需要机器上安装了CLR,CLR目前作为.NET Framework的一部分。当然,编译过程中除了生成IL,编译器还需要在托管模块中生成完整的元数据。

  注意:我们可以将编译器理解为语法检查器,编译器负责检查源代码,确保我们写的代码合法并且有意义,CLR不关心开发人员使用哪种编程语言,因此不同的公司可以面向CLR用自己的语言和编译器。我们可以用支持CLR的任何一种语言创建源代码文件,然后用对应的编译器检查语法和分析源代码。CLR输出对你的意图进行描述的代码。

  无论哪一种编译器,结果都是一个托管模块(managed module)。托管模块是一个标准的32位 Microsoft Windows 可移植执行体(PE32)文件,或者是一个标准的64位Windows可移植执行体(PE32+)文件,他们都需要CLR才能执行。顺便说一句,托管的程序集总是利用Windows的数据执行保护(Data Execution Prevention,DEP)和地址空间布局随机化(Address Space Layout Randomization ASLR),这两个功能旨在增强整个系统的安全性。

  下面具体说明:

  (1)PE32或者PE32+头: 标准的Windows PE文件头,类似于“公共对象文件格式”(Common Object File Format,COFF)头。如果这个头使用PE32格式,文件能在Windows的32位或64位版本上运行。如果这些头使用PE32+格式,文件只能在Windows的64位版本上运行。这个头还标示了文件类型,包括GUI,CUI后者DLL,并包含一个时间标记来指出文件的生成时间。对于只包含IL代码的模块,PE32(+)头的大多数信息会被忽视。对于包含本地CPU代码的模块,这个头包含了与本地CPU代码有关的信息。
   (2)CLR头:包含使这个模块成为一个托管模块的信息(可有CLR和一些实用程序进行解释)。头中包含了需要CLR版本,一些标志(flag),托管模块入口方法(Main方法)的MethodDef元数据标记(token),以及模块的元数据、资源、强名称、一些flag以及其他不太重要的数据项的位置/大小。
   (3)元数据:每个托管模块都包含元数据表。主要有两种类型的表:一种类型的表描述源代码中定义的类型和成员;另一种类型的表描述源代码应用的类型和成员。由于编译器同时生成元数据和代码,把他们绑定一起,并嵌入最终生成的托管模块,所以元数据和它描述的IL代码永远不会失去同步。元数据能够元数据消除了对本地C/C++头和库文件的需求;同时智能感知技术能够帮助我们写代码,因为指出了一个类型提供了那些方法属性字段事件等信息;元数据允许垃圾回收器跟踪对象的生存期,有利于垃圾回收;元数据确保只执行类型安全的操作;元数据能够将一个对象的字段序列化到内存中发到其他机器进行反序列化。
   (4)IL(中间语言)代码:编译器编译源代码时生成的代码。在运行时,CLR将IL编译成本地CPU指令。

三、托管代码合并成程序集

  CLR通常是和程序集一起工作的,而不是模块。

  程序集是一个或多个模块/资源文件的逻辑分组。程序集是重用、安全性以及版本控制最小单元。既可以生成单文件或者多文件的程序集。程序集相当于一个“组件”。一些托管模块和资源(或数据)文件准备交由一个工具处理。该工具生成独立一个PE32(+)文件来表示文件的逻辑性分组。

  实际发生的事情是,这个PE32(+)文件包含一个名为“程序集清单”(manifest)的数据块。清单是由元数据表构成的另外一种集合。这些表描述了构成程序集的文件,有程序集中的文件实现的公开导出类型,以及与程序集关联在一起的资源或数据文件。

.NET Framwork 之 源代码编译成托管代码托管代码合并成程序集的更多相关文章

  1. [CLR via C#]1.1 将源代码编译成托管代码

    原文:[CLR via C#]1.1 将源代码编译成托管代码 1. 公共语言运行时(Common Language Runtime,CLR)是一种可由多种编程语言使用的"运行时". ...

  2. 【CLR via C#】CSC将源代码编译成托管模块

    下图展示了编译源代码文件的过程.如图所示,可用支持 CLR 的任何一种语言创建源代码文件.然后,用一个对应的编译器检查语法和分析源代码.无论选用哪一个编译器,结果都是一个托管模块(managedmod ...

  3. C++ 编译器用于把源代码编译成最终的可执行程序

    C++ 编译器写在源文件中的源代码是人类可读的源.它需要"编译",转为机器语言,这样 CPU 可以按给定指令执行程序. C++ 编译器用于把源代码编译成最终的可执行程序. 大多数的 ...

  4. 【转】Android源代码编译命令m/mm/mmm/make分析--不错

    原文网址:http://blog.csdn.net/luoshengyang/article/details/19023609 在前文中,我们分析了Android编译环境的初始化过程.Android编 ...

  5. linux源代码编译安装OpenCV

    为了尽可能保证OpenCV的特性,使用OpenCV源代码编译安装在linux上.先从安装其依赖项開始,以ubuntu 14.04.X为例解说在Linux上源代码编译安装OpenCV,其它linux版本 ...

  6. React Native Android入门实战及深入源代码分析系列(2)——React Native源代码编译

    本文为老曾原创.转载需注明出处:viewmode=contents">http://blog.csdn.net/minimicall?viewmode=contents 在上一节中,我 ...

  7. Win7+VS2010:mysql 源代码编译与调试

    win7+vs2010源代码编译mysql 近期因为在实习,工作重点在于一些数据库的开发,为了更好的理解数据库的实现机制.眼下萌生了要研究一下mysql数据库源代码的想法.那么好吧,说干就干.首先我们 ...

  8. Python3源代码编译安装

    Python3源代码编译安装 安装必要工具 yum-utils ,它的功能是管理repository及扩展包的工具 (主要是针对repository) $ sudo yum install yum-u ...

  9. 源代码编译安装Python3.5.2

    由于没有找到Python3.5的rpm安装包,因此进行源代码编译安装 1.下载Python3.5.2 [root@seastar ~]# cd /usr/local/src [root@seastar ...

随机推荐

  1. 《深入理解Android2》读书笔记(八)

    接上篇<深入理解Android2>读书笔记(七) AMS中的进程管理 AMS对进程的管理仅涉及两个方面 1.调节进程的调度优先级和调度策略 2.调节进程的oom值 调度优先级和调度策略 1 ...

  2. 17-7-20-electron中主进程和渲染进程区别与通信

    老规矩,先吐槽,再记录. 今天被上司教育了将近一个小时.因为之前自动更新的模块,我认为已经完成了,但是还有一些细节没有完善好,就一直一直的被教育~ 事情全部做完,提交以后关闭issue! electr ...

  3. ZOJ 3497 Mistwald

    矩阵快速幂. 邻接矩阵的$P$次方就是走$P$步之后的方案数,这里只记录能否走到就可以了.然后再判断一下三种情况即可. #pragma comment(linker, "/STACK:102 ...

  4. 洛谷——P1104 生日

    P1104 生日 题目描述 cjf君想调查学校OI组每个同学的生日,并按照从大到小的顺序排序.但cjf君最近作业很多,没有时间,所以请你帮她排序. 输入输出格式 输入格式: 有2行, 第1行为OI组总 ...

  5. 【BZOJ 4025】 (CDQ?还是整体二分?+并查集及它的恢复操作)

    4025: 二分图 Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简单的问题神犇当然会做了,于是他想考 ...

  6. 【动态规划】【二分】CDOJ1006 最长上升子序列

    最长上升子序列. 要求输出字典序最小解. 就在更新答案的时候记录一下前驱.容易发现记录的这个玩意实际上形成了一个森林. #include<cstdio> #include<algor ...

  7. 【最大流Dinic模板】HDU1532&POJ1273-Drainage Ditches(16/3/6更正)

    #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #inc ...

  8. [USACO13NOV]No Change

    题目大意: 你有k(k<=16)个硬币,每个硬币都有自己的面值. 现在你要给n件商品付钱,每件商品也有自己的价格. 然而老板是个奸商,他绝对不会给你找钱. 你每次付钱只能用一个硬币,但是你可以一 ...

  9. cocos2d-x解析xml时的Bug

    cocos2d-x中使用tinyxml解析xml配置.如下: tinyxml2::XMLDocument doc; if (tinyxml2::XML_SUCCESS != doc.LoadFile( ...

  10. ObjC的initialize和init

    Objective-C很有趣的一个地方是,它非常非常像C.实际上,它就是C语言加上一些其他扩展和一个运行时间(runtime). 有了这个在每个Objective-C程序中都会起作用的附加运行时间,给 ...