** .NET Framework ** ** 之 ** ** ** ** Common Language Runtim ** ** e **
** CLR ** ** 是什么? **
上次讲到运行在 .NET Framework 中的代码叫做 managed code, 反之叫做 unmanaged code 。相比 unmanaged code,managed code 有很多好处,比如可以用多种编程语言编写、提高安全性、易于版本控制和程序发布等等。这些都是由 CLR 提供的。但也有一些不利点,最容易想到的就是代码运行速度问题了。
要为 managed code 提供以上功能, CLR 必须知道代码中的数据类型、类和与她有关连的 assembly 的定义。这些信息叫做 metadata ,而 metadata 就包含在代码中的某个部分(编译后)。 CLR 利用这个 metadata 加载代码段、管理内存、执行方法调用等操作。
.NET 出来以前,在不同编程语言之间共享原代码,简直是不可能的事情。因为每个编程语言定义的数据类型不同,而且语法也不同。微软大师们想到了把数据类型统一的好办法。这个技术叫 CTS ( common type system )。现在做项目开发就比较简单了(用不同语言),比如一个项目组里有会用 VB 的,会用 C++ 的。可能以前的方法是把两个人之间互相调用的功能写成 DLL 或 COM 。但现在不用这么麻烦了,你直接就可以使用其他语言编写的代码了。具体一点,用 VB.NET 可以继承 C++.NET 写的类,反过来也是可以的。
我们安装软件的时候常碰到这样的提示 - 系统中的组件比要安装的组件的新,你要替换还是保留?是不是很讨厌?!现在开始你就用 .NET 吧,她不会因为这个“小”问题而打扰你了。因为每个代码都包含与她相关的 metadata , CLR 会根据这个信息来管理代码的不同版本。而且因为不用把代码的信息注册到注册表,所以可以用 X-COPY 的方式安装代码(就是简单的拷贝粘贴了)。
是用 VB 做好呢?还是用 C++ 做好呢?这些问题是我们做项目的时候常要考虑的问题。但在 .NET 用什么编程语言已经变得不重要了(但还是有一定的差别,在特定项目中),因为 CLR 提供 CTS (还有 base class library ) , 而且都运行在 CLR 上面。在 .N ET 中 VB , C++ 等语言都有了相当多的提高,而且有了新的语言 C# 。 C# 已经申请了标准而且通过,可想而知她的 POWE 了。大家知道 borland 也发布了相关的开发工具 C# builder 。
做个小结
n .NET 代码都包含与自己相关的信息 叫做 metadata 。
n CLR 提供 CTS ( CLS 也有功劳),所以可以在不同编程语言之间共享原代码。
n 用 metadata 管理代码信息(不是利用注册表),所以代码易于安装。
n 使用统一的数据类型和类库,所以编程语言的选择变得不重要了,而且易于团队开发。
** 代码在 CLR ** ** 中的运行过程 **
n 选择编译器
首先 CLR 选择编译器,因为 CLR 中可以运行不同语言开发出来的代码。
n 把代码编译成 MSIL
CLR 利用选择的编译器生成 MSIL ( Microsoft intermediate language )和 metadata 把她们加载到 PE ( portable executable file )。
MSIL :解释语言,包含代码信息,让 JIT 易于编译成机器语言。与操作系统和编程语言无关。
PE :可执行文件格式, windows 就是 DLL 或 EXE 了。
n 用 JIT 编译器把 MSIL 编译成机器语言
有两种方式一种是只编译当前执行的代码段,另一种是把整个代码一次性编译。 JIT 会检测代码的安全性。
n 执行代码
代码首次调用就会编译成机器代码,再次调用的时候就不再重新编译了。
__ 相关工具 _ _
- MSIL 生成器 - MSIL Assembler( ilasm.exe )
- MSIL 反编译器 - MSIL Assembler( ildasm.exe )
使用法
__ 相关资料 _ _
- PE 结构
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconmetadatapefilestructure.asp
** 参考资料 **