源代码编译成托管代码;托管代码合并成程序集;

.NET是如何将源代码编译成托管代码,又是如何将托管代码合并成程序集?首先,我们先了解下常见的CLR,.NET Framework,IL等名词。

一,说说常见的名词

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

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

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

二,如何将源代码编译成托管代码

将源代码编译成托管模块,就是本地代码编译器根据机器的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(+)文件包含一个名为“清单”的数据块。清单是由元数据表构成的另外一种集合。这些表描述了构成程序
集的文件,有程序集中的文件实现的公开导出类型,以及与程序集关联在一起的资源或数据文件。

时间: 2024-11-05 13:08:52

源代码编译成托管代码;托管代码合并成程序集;的相关文章

.NET Framwork 之 源代码编译成托管代码托管代码合并成程序集

我们都知道,C#程序需要在 .NET Framework 的环境中运行. 一.程序运行所需的三个关键 1.IL(中间语言):编译器编译源代码时生成的代码. 2. Framework类库(Framework Class Library,FCL):FCL是一组DLL程序集的统称,其中包含数千个类型定义和功能. 3.CLR(公共语言运行时,Common Language Runtime):它和Java虚拟机一样也是一个运行时环境,是一个可由多种编程语言使用的运行环境.CLR的核心功能包括:内存管理.程

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

下图展示了编译源代码文件的过程.如图所示,可用支持 CLR 的任何一种语言创建源代码文件.然后,用一个对应的编译器检查语法和分析源代码.无论选用哪一个编译器,结果都是一个托管模块(managedmodule).托管模块是一个标准的 32 位 Microsoft Windows 可移植执行体(PE32)文件 6 ,或者是一个标准的 64 位Windows 可移植执行体(PE32+)文件,它们都需要 CLR 才能执行.顺便说一句,托管的程序集总是利用了 Windows 的数据执行保护(Data Ex

Java前端编译:Java源代码编译成Class文件的过程

Java前端编译:Java源代码编译成Class文件的过程 在上篇文章<Java三种编译方式:前端编译 JIT编译 AOT编译>中了解到了它们各有什么优点和缺点,以及前端编译+JIT编译方式的运作过程. 下面我们详细了解Java前端编译:Java源代码编译成Class文件的过程:我们从官方JDK提供的前端编译器javac入手,用javac编译一些测试程序,调试跟踪javac源码,看看javac整个编译过程是如何实现的. 1.javac编译器 1-1.javac源码与调试 javac编译器是官方

C#程序(含多个Dll)合并成一个Exe

把C#程序(含多个Dll)合并成一个Exe的超简单方法 开发程序的时候经常会引用一些第三方的DLL,然后编译生成的exe文件就不能脱离这些DLL独立运行了. 但是,很多时候我们本想开发一款只需要一个exe就能完美运行的小工具.那该怎么办呢? 下文介绍一种超简单的方法,不用写一行代码就可轻松实现. 这里我们需要用到一款名为Fody.Costura的工具.Fody.Costura是一个Fody框架下的插件,可通过Nuget安装到VS工程中.安装之后,就可以将项目所依赖的DLL(甚至PDB)文件全部打

把C#程序(含多个Dll)合并成一个Exe的超简单方法

原文:把C#程序(含多个Dll)合并成一个Exe的超简单方法 开发程序的时候经常会引用一些第三方的DLL,然后编译生成的exe文件就不能脱离这些DLL独立运行了. 但是,很多时候我们本想开发一款只需要一个exe就能完美运行的小工具.那该怎么办呢? 下文介绍一种超简单的方法,不用写一行代码就可轻松实现. 这里我们需要用到一款名为Costura.Fody的工具.Costura.Fody是一个Fody框架下的插件,可通过Nuget安装到VS工程中.安装之后,就可以将项目所依赖的DLL(甚至PDB)文件

利用Costura.Fody制作绿色单文件程序(C#程序(含多个Dll)合并成一个Exe)

原文:利用Costura.Fody制作绿色单文件程序(C#程序(含多个Dll)合并成一个Exe) 开发程序的时候经常会引用一些第三方的DLL,然后编译生成的exe文件就不能脱离这些DLL独立运行了.这样交给用户很不方便,希望的效果是直接交付一个exe文件. 这时候就需要借助一款名为Fody.Costura的插件.Fody.Costura是一个Fody框架下的插件,可通过Nuget安装到VS工程中.安装之后,就可以将项目所依赖的DLL(甚至PDB)文件全部打包到EXE文件里. 使用 Costura

多个UIImage合并成一个UIImage

多个UIImage合并成一个UIImage 创建两个UIImage UIImage *image1 = [UIImage imageNamed:@"iOSDevTip"]; UIImage *image2 = [UIImage imageNamed:@"CodePush"]; 创建UIImage的方法有很多种,我们就简单的通过imageNamed:方法来创建. 合并之后的size CGSize size = CGSizeMake(image1.size.width

TSQL--按某字段列分组,在将各组中某列合并成一行

鉴于群里很多同事在问这个问题,我简单写个Demo,希望对初学者有帮助! 无真相,无解说,不解释,直接上Code! --================================================== --示例代码,仅供参考 --按照object_id分组,将同一组的name列的值合并在一起 SELECT OBJECT_NAME(T1.object_id) AS ObjectName , ( SELECT T2.name + ',' FROM sys.all_columns T

mysql 将多个查询结果合并成一行

mysql中的多行查询结果合并成一个 SELECT GROUP_CONCAT(md.data1) FROM DATA md,contacts cc WHERE md.conskey=cc.id AND md.mimetype_id= 5 AND md.user_id=17: 利用函数:group_concat(),实现一个ID对应多个名称时,原本为多行数据,把名称合并成一行,如|1 | 10,20,20| 本文通过实例介绍了MySQL中的group_concat函数的使用方法,比如select