《深入了解.NET框架》

时间:2022-06-11 17:12:07

深入了解.net框架(一)
理解受管理的执行(managed excution)
    在受管理的执行过程的第一步是设计源程序。如果你想你的应用程序受益于common language runtime(公共语言运行时),你必须使用一个或多个支持运行时的语言编译器,比如visual basic,c#,visual c++或者其他第三方编辑器,比如perl或cobel编辑器。
    由于运行时(runtime)是一种多语言执行环境,它广泛的支持多种数据类型和语言

特性。你所使用的编辑器决定了将要使用运行时(runtime)哪一部分的功能,这样,你

可以使用这些特性设计你的代码。你代码的语法时由编辑器决定的,而不是由运行时决定的。如果你的组件要能够被其他语言编写的组件完全可用,你必须在组件的导出类型中使用这种包括在common language specification(CLS)中的语言特性。
    当你的代码被写好,编译好后,编辑器将它翻译成微软中间语言(MSIL),并产生所需要的元数据(metadata)。当你准备执行你的代码时,MSIL就通过Just In Time(JIT)

编辑器编译成本地代码(即:适合本机执行环境的代码)。如果安全策略要求代码是安全类型的,JIT编辑器的还要检测IL是否是安全类型(type-safety)的;如果安全类系检查没有通过,当代码执行时,将抛出一个例外(exception)。
    在执行过程中,运行时(runtime)提供许多服务,包括自动内存管理,调试支持,

加强安全性和使代码能和其他非管理代码(unmanaged code)比如COM组件之间协调工作的能力。下面将介绍更多的关于受管理的执行的详细信息。
    1、
    微软中间语言(Microsoft Intermediate Language MSIL)
    如果你把你的源程序编译成受管理的代码(managed code),编辑器将把你的源代码翻译成微软中间语言(MSIL)。MSIL与具体的CPU指令无关,并能有效的转化为本地代码。MSIL包括很多指令,比如用于转载,存储,初始化,调用对象方法的指令,以及用于算术、逻辑运算,控制流,直接内存访问,例外处理等指令。在代码被执行前,MSIL必须被JIT(Just In Time)编辑器转化成适合特定CPU的代码。由于运行时支持一个和多个用于不同计算机体系结构的JIT编辑器,所以相同的MSIL能够被JIT编译后在任何一台MSIL支持的计算机上运行。
    当一个编辑器产生了MSIL后,它也产生了元数据(metadata),它能够描述你的代码中的类型,包括每种类型定义,每种类型成员的识别标志,你的代码应用的成员和其他在代码执行的时候运行时(runtime)所要使用到的数据。MSIL和元数据被包含在PE (Portable Executable)文件中。这种文件是基于和扩展了已经发布了的Microsoft

Portable Executable(PE)和Common Object File Format(COFF)。这种包括了MSIL或者

本地代码一级元数据的文件格式使操作系统能识别公共语言运行时(Common Language

Runtime)映象。在这个有MSIL的文件里,元数据的存在使你的代码能够描述它自身,这就意味着不再需要类型库或者IDL。当在执行过程中,运行时(runtime)能定位和摘取所需要的元数据。
    2、
    JIT编译
    在MSIL被执行之前,它必须被.net框架Just In Time(JIT)编译器转化成本地代码

(native code),这是一种与特定CUP有关(CUP-specific)的代码,它能运行在有JIT编

辑器的相同体系结构的计算机上。由于运行时提供了一个能支持不同CPU的的JIT编辑器,开发人员就能够写出一套能被JIT编译后,在不同体系结构的计算机执行的MSIL。(如果你的受管理的代码调用了特定平台的本地APIs或者特定平台的类库,你的代码就只能运行在这个特定的操作系统。)
    在JIT编辑后,我们可以获得某些代码在执行过程中从来不会被调用的信息。这样,与其消耗许多时间和内存将包含所有的MSIL的PE文件转化成本地代码,不如只将要使用MSIL转化为本地代码。装载器在装载时为每种类型的方法创建一个stub(关于将MSIL转化成本地代码的方法的信息描述,包括方法的入口地址等),并和方法联系起来。在调用方法的初始化时,这个stub将控制传给JIT编译器,编译器把方法的MSIL转化成本地代码并将stub指向本地代码的地方。以后在被JIT编译的指向先前生成的本地代码的方法调用时,就会减少被JIT编译器和执行代码所花费的时间。
    在将MSIL转化成本地代码的过程中,代码必须通过一个认证过程(除非管理员已经建立了安全策略,这样就可以将代码绕过认证)。认证检查MSIL和元数据,以便知道代码是否时类型安全的(type-safe),这也就意味着对经过授权的内存进行访问。类型安全对确定对象之间是否时安全独立的很重要。这样就能防止无意和恶意的冲突。类型安全也为代码的安全限制可靠的加强提供了保障。
    由于代码时经过安全类型检测的,所以运行时就能保证下面的几条:
    .对类型的引用是和正在应有的类型是严格兼容的
    .只有正确的定义的操作才能被一个对象调用
    .标识符是被申明了的
    在认证过程中,检查MSIL代码以便确定代码是否被允许访问的内存地址和是否通过正确定义的类型调用方法。例如,代码不能访问所限定的内存以外的地址。此外,由于错误的MSIL能导致类型安全规则错误,认证要观察代码,看MSIL是否被正确的产生。认证过程只传递类型安全的代码。然而,某些类型安全的代码由于认证过程的限制而不能通过认证,并且有些语言也不能产生可认证的类型安全代码。