CLR的执行模型(1):将源代码编译成托管模块

终于下决心写这个系列了。

之前看过那本《C#图解教程》,但是被某大佬推荐了《CLR via C#》,才发现自己对真正的力量一无所知。

不过也正因为无知,所以才下决心开始在博客上记录这些吧。

(一)CLR简介

CRL,全名Common Language Runtime,公共语言运行库,是一个多个编程语言使用的“运行时”。CLR的核心功能,比如内存管理、程序集加载、安全性、异常处理、线程同步,可由面向CLR的所有语言使用。

支持CLR的任何语言都可以创建源代码文件,然后用对应的编译器检查语法,分析代码。无论是什么编译器,最后都是托管模块。托管模块是标准的32位的可移植执行体(PE32)文件,或者是64位的(PE32+),都需要CLR才能运行。

                   将源代码编译成托管模块

 

(二)托管模块的组成部分

PE32或者PE32+头:使用PE32头,文件能在32和64位机器上运行。PE32+只能在64位机器上运行。

        

 

CLR头:包含使这个模块成为托管模块的信息。

IL中间语言代码:编译器编译源码的时候生成的代码。运行时,CLR将IL编译成本机CPU指令。

元数据:面向CLR的每个编译器要在每个托管模块中生成完整的元数据。元数据是一个数据表的集合。一些数据描述了模块中定义了什么,另一些描述了模块中引用了什么。由于编译器同时生成元数据和代码,把他们绑在一起,并嵌入最终生成的托管模块。所以元数据和他描述的代码不会失去同步。

C#,VB,F#和IL汇编器总是生成包含托管代码IL和托管数据(可GC的数据类型)的模块。为了执行包含托管代码以及托管数据的模块,用户必须在自己的计算机上装好CLR。

 

原文地址:https://www.cnblogs.com/renzhoushan/p/10353017.html