C#基础之CLR的执行模型(一)

一、将源代码编译成托管模块

 

  • 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的智能感知,比如类型验证,比如序列化,比如垃圾回收器跟踪对象生存期。

posted @ 2016-12-14 21:59  初一大雪  阅读(323)  评论(0编辑  收藏  举报