读书笔记一:1.1 把源代码编译成托模块
当我们准备好用.net做为开发工具时候我们要了解.net是如何工作的,
1.CLR (Common Language Runtime)公共语言运行时:顾名思义,就是由多种语言使用的运行时。CLR 把编译好的托管代码作为执行对象对其进行执行。什么是托管代码呢?就是不是由本地计算机执行的代码,是由CLR 执行的代码,CLR 把他翻译成与本地CPU 相关的代码,也就是说托管代码 是与运行平台无关的中间代码。
2.如何编写托管代码呢?托管代码就是称为中间语言的代码(IL),IL代码可以由多种语言编译器生成,可以用C# VB.NET F#等等 。对于编写好的源代码,我们可以用编译器对其编译,编译好的代码 就称为托管代码,托管代码的展现形式不是以源文件不是可以直接用记事本打开的一些二进制代码 而是一个模块 称为托管模块,托管模块式一个标准的PE文件(可移动,可执行的文件)PE有PE32文件 PE32+文件
|
C#源代码 ----------àC#编译器-------à托管模块(元数据,IL代码,PE32(+)头,CLR头) |
|
VB#源代码 ----------àVB#编译器-------à托管模块(元数据,IL代码,PE32(+)头,CLR头) |
一个托管模块包括以下内容
|
PE32 PE32+头 |
如果标记为PE 32 文件则必须运行在 Windows 32 位机器上,如果标记为PE32+文件则必须运行在 Windows 64位机器上,PE 头还包括了该文件的类型是 GUI 还是DLL EXE 等。生成的时间,对于只包含IL代码的托管模块(多个托管模块(其中有一些只包含IL代码)是可以合并的),对于托管模块包括非托管的代码的时候(CPU代码) 该PE 头包含和本地CPU 代码 相关的一些信息。 |
|
CLR 头 |
CLR 头包含了 本模块的 CLR 版本 一些flag ,MAIN方法的入口地址,已经MethodDef的一些数据的标记 等等 不重要的数据项的位置和大小。 |
|
元数据 |
元数据主要包含两种数据表 :一个数据表是表示源代码所表述的一些类型和成员,还有一个表 表示源代码所引用的的类型和成员。 |
|
IL代码 |
托管代码咯(编译器生成的中间代码)在运行时候由CLR 执行。 |
需要注意的是元数据和IL代码是同时生生成的。
元数据有很多用途,列举一部分:
1. 元数据中包含源代码的类型和成员的定义和所引用的类型成员的定义,如果 需要提取托管模块的内容,可以直接从元数据提取内容。
2. 类型安全的。
3. 比如 VS里面的 智能感知的应用。
4. 元数据允许 将一个类型的字段序列化到内存中,然后通过网络发送到另一台服务器进行反序列化,可以重建对象。
5. 可以利用元数据进行垃圾回收,对于不在引用的对象,进行垃圾回收。
最后注意的是C++编译器 里面可以写一些非托管的代码(不是由CLR执行的代码) 这样可以向前兼容。

浙公网安备 33010602011771号