Sodier的专栏

欲穷千里目 更上一层楼

.NET框架开发平台体系架构

        很多人或许正在用微软的.NET作为开发平台来开发软件,.NET平台相对来说是个比较复杂的集成开发环境,功能很全,也很方便,对于熟悉.NET平台的开发人员来说,这是一个功能强大的开发工具,然而,对于对于很多初次接触.NET平台的人来说,功能全却意味着使用的复杂,如果能够理解.NET平台的内部运作机制,对于理解和使用这个平台,相信会有不少的裨益。笔者也是这个平台的初级用户,最初使用.NET的时候,就觉得心里很不踏实,因为不了解.NET的工作方式,所以就找了一本讲原理的书来看,看了之后就觉得豁然开朗,所以就把我所看到的这些文字和我的一点点理解拿出来和大家共享,希望有所裨益。而且作出一点点地总结,对自己本身也是一种非常好的学习方式。

        .NET平台的一个关键组成部分就是.NET框架,包含公共语言运行库(Common Language Runtime,CLR)和.NET框架类库(Framework Class Library,FCL)两个部分,,NET平台开发的程序,就有赖于.NET框架来执行,所以运行.NET程序,就必须安装.NET框架。FCL中有几千个类型的定义,还有名称空间。

        Java通过JVM(Java虚拟机)的方式提供了通用性,使得Java程序独立于硬件和软件平台,而.NET程序实际上也是提供了一定的通用性,程序在不同硬件平台上都能运行,也就是说对硬件独立,但是它没有达到软件的独立性,任何平台只有安装了Windows操作系统和.NET框架才能运行.NET程序。(至于为什么,以下会述及)

        .NET平台本身支持多种语言,而这些语言写的程序都会被编译器(不同语言写的程序有不同的编译器)编译成一种中间语言IL代码,这种IL代码和元数据一起形成托管模块,这就是各种不同语言的编译器的最终产出。

        而CLR就是一个可被各种不同的编程语言所使用的公共语言运行库。CLR包含丰富的功能,每一种语言由于其本身的特性,可能只用到CLR的一个子集。上面的图演示了不同语言编写的源码文件的编译过程。图中的托管模块是一个需要CLR才能执行的标准Microsoft Windows可移植执行(Portable Executable,PE)文件,包括IL(Intermediate Language)代码和与之相关联的元数据。元数据是数据表的集合,描述了模块中定义的内容(类型和成员),引用到的一些内容(类型和成员)等。元数据总是和IL代码文件相关联,两者不可分离。编译器总是同时产生IL代码和元数据,并将它们嵌入到托管模块中。

  .NET程序往往不是一个单一的托管模块,而是由多个托管模块和一些资源文件(.jpeg、.gif、.html等)组成,这就是程序集(Assembly),它是组件复用、安全和版本管理的最小单位,可以简单的看作是一个工程。

  每个程序集可能是一个可执行程序,或者是一个包含供可执行应用程序使用的DLL,CLR负责管理其中的IL代码的执行。当一个EXE程序集被创建时,编译器/连接器产生一些特殊的信息,将它们嵌入到生成程序集的PE文件表头和该文件的.text部分,当调用该EXE文件时,这些特殊信息将导致CLR被加载并初始化,CLR随后定位到应用程序的入口点方法,是的应用程序得以执行。

   以下就来看一看IL代码的执行过程以及解释为什么说.NET程序有一定的硬件平台独立性。

  前面已经说过托管模块是由IL代码和元数据组成,而IL代码是比cpu指令更高级的语言代码,而正是有了这样一种中间语言IL,才使得开发的.NET程序有了一定的硬件平台独立性。程序编译的时候生成的是托管模块(组合成程序集),在执行的时候,包含在托管模块中的IL指令才被CLR即时编译器真正地转换为本地CPU指令(注意是在程序被执行的时候),所以通过这种执行时转换的方式,就达到了硬件平台无关的特性,可以说和JAVA的虚拟机有一定的类似之处。另外,程序中的一个方法被多次执行的时候,只需要在第一次执行的时候转换成本地CPU指令,而后的执行就可以通过指向第一次执行的指令地址而直接执行,无需再转换,这也在一定程度上兼顾了速度和效率的问题。

参考资料:Microsoft .NET框架程序设计—Visual Basic .NET语言描述

 

       

阅读更多
个人分类: 学习历程
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭