二:认识托管代码

     前面已经学过了托管代码的概念,现在要学的是托管代码的组成。
在DonNet平台下,不管用何种编程语言,只要编译器面向CLR就可以工作。但不同语言有不同的优势,所以应该选最能表达自己意图的语言。

  如上图,无论使用哪一种语言和编译器,结果都是生成一个托管模块,托管模块是一个标准的32位Microsoft Windows可移植执行体(PE32)文件,或者是一个标准的64位Microsoft Windows可移植执行体(PE32+)文件,它主要由PE32或PE32+头,CLR头,元数据和中间语言构成的,它需要CLR管理才能执行,所以就叫做托管模块。
什么是PE文件呢,PE 的意思就是 Portable Executable(可移植的执行体),就像上面一样简单的说就是Microsoft Windows可移植执行体文件,这里有它的结构组成的解释http://www.cnblogs.com/ilove/archive/2008/04/15/1157228.html。而托管模块中的PE32或PE32+头就是标准的Windows PE文件头,如果这个头使用PE32格式,则文件能在Windows的32位或64位版本上运行,如果是PE32+那就只能在64位上运行。
     CLR头包含使这个模块成为一个托管模块的信息(由CLR头和实用程序来解释),包含所要求的CLR版本,一些标志,托管模块入口方法(Main方法)的MethodDef元数据标记,以及模块的元数据、资源、强名称、一些标志以及其他不太重要的数据项的大小和位置。
     元数据(metadata)是一系统特殊的数据表,主要有两种类型的表,一种是用于描述源代码中定义的类型和成员,一种是描述源代码引用的类型。
     中间语言,Intermediate Language,编译器编译编译产生的代码就叫做中间语言,CLR将IL编译成本地CPU指令。IL是基于堆栈的,这意味着它的所有指令都要将操作数压入一个执行堆栈,结果从这个堆栈中弹出。由于IL没有提供操作寄存器的指令,所以编译器开发人员可以很容易的生成IL代码。他们不必关心寄存器的管理问题,需要的IL指令也比较少,因为没有专门用于操作寄存器的指令。IL指令还是"无类型"的,IL最大的优势并不在于它是脱离了底层CPU的一种抽象,在于它提供应用程序的可靠性和安全性。
  托管代码与非托管代码的相互操作有以下几点:
  (1)托管代码能调用DLL中的一个非托管函数
  (2)托管代码能够使用一个现有的COM组件
  (3)非托管代码能够使用一个托管类型

posted @ 2009-01-19 01:33  Done  阅读(1047)  评论(0编辑  收藏  举报