一、将源代码编译成托管模块
- CLR是什么?
全称是Common Language Runtime,即公共语言运行时。
所谓公共,也就是说,它支持多种编程语言。这正是它的牛逼之处,想一想,你可以用你所擅长的语言来实现功能,甚至能将多种语言杂揉在一起,各司其职,多酷啊!
- 微软提供了好几个面向运行时的编译器,你造吗?
C++/CLI、C#、Visual Basic、F#、Iron Python、Iron Ruby。除此之外,还有一个中间语言汇编器IL(Intermediate Language)。
这些编译器最终会将源代码,编译成托管模块。
其中C++编译器是最强的,因为它允许开发人员同时写托管和非托管代码,并生成到同一个模块中!最最关键的是,只有C++编译器才有这功能,别的编译器都没有!独一无二啊有米有!
是时候学好C++跟人装逼了!
除了微软,其他机构也提供面向CLR的各种编译器。
- 托管模块是啥?
它是标准的32位Windows可移植执行体文件,也就是传说中的PE32,也可以是标准的64位Windows可移植执行体文件,即PE32+,具体看编译时CPU的设置了。
据说托管程序集会利用Windows的数据执行保护和地址空间布局随机化,以增强整个系统的安全性。
- 托管模块中都有啥?
组成部分 | 说明 |
PE32或PE32+ | 它决定了程序是在32位系统,还是64位系统上运行。 除此之外,它还标识了文件类型(GUI、CUI、DLL)和生成时间。若是包含本机CPU代码的模块,还会包含与本机CPU代码有关的信息。 |
CLR头 | 包含CLR版本,托管模块入口方法的MethodDef元数据token,以及模块的元数据、资源、强名称、标志等。 |
元数据 | 每个托管模块都有元数据表。主要有两种表,一是描述源代码中定义的类型和成员的表,一是描述源代码引用的类型和成员的表。 |
IL代码 | 编译后的代码。在运行时,CLR将它编译成本机CPU指令。 |
- 元数据都有啥用?
多了去了,比如它包含了C/C++的类型和成员信息,从而免去了读取C/C++库文件,比如VS的智能感知,比如类型验证,比如序列化,比如垃圾回收器跟踪对象生存期。