更新时间:2022-02-24 21:45:27
——当我第一次听到Microsoft .NET平台时,我就知道它将续写微软不败的神话。(Jeffrey Richter)
这篇文章我很早很早之前就想写了,本来是想把它作为我开博的第一篇的,但由于种种原因直到现在写出来。本文不是用.NET平台和其余平台(诸如Java)做比较,不去评论孰优孰劣。仅仅是作为一个.NET开发者,介绍一下我眼中的.NET。
.NET Framework包括公共语言运行时(Common Language Runtime,CLR)和框架类库(Framework Class Library,FCL)。
.NET Framework提供一个托管执行环境、简化开发和部署、整合了多种开发语言。CLR是.NET体系的基础,所有的.NET代码都运行在CLR之上,并且与FCL紧密结合,并由此创建基于.NET的Windows Forms、Web Forms和XML Web Services等应用程序。.NET Framework的下层是操作系统,上层是.NET的高级开发语言(C#、F#等)。
CLR(公共语言运行时,Common Language Runtime)和Java虚拟机一样也是一个运行时环境,它负责资源管理(内存分配和垃圾收集),并保证应用和底层操作系统之间必要的分离。
为了提高平台的可靠性,以及为了达到面向事务的电子商务应用所要求的稳定性级别,CLR还要负责其他一些任务,比如监视程序的运行。按照.NET的说法,在CLR监视之下运行的程序属于“托管”(managed)代码,而不在CLR之下、直接在裸机上运行的应用或者组件属于“非托管”(unmanaged)的代码。
CLR将监视形形色色的常见编程错误,许多年来这些错误一直是软件故障的主要根源,其中包括:访问数组元素越界,访问未分配的内存空间,由于数据体积过大而导致的内存溢出,等等。
可以使用 C# 语言编写托管代码,C# 语言提供了下列优点:
.NET Framework 类库是一个由 Microsoft .NET Framework 中包含的类、接口和值类型组成的库。该库提供对系统功能的访问,是建立 .NET Framework 应用程序、组件和控件的基础。为便于语言之间进行交互操作,.NET Framework 类型是符合 CLS 的,并因此可在任何编程语言中使用,只要这种语言的编译器符合公共语言规范 (CLS)。NET Framework 包括的类型执行下列功能:
.NET Framework 提供一组丰富的接口以及抽象类和具体(非抽象)类。可以按原样使用这些具体的类,或者在多数情况下从这些类派生您自己的类。若要使用接口的功能,既可以创 建实现接口的类,也可以从某个实现接口的 .NET Framework 类中派生类。.NET Framework 类库提供下列命名空间。
.NET上的程序从源码到执行有以下几个步骤(来自Jeffery Richter的《.NET框架程序设计》):
这几个过程我总结为下图:
图2、.NET上的程序运行
关于托管模块与程序集的关系,我理解如下:
CLR实际上不和托管模块打交道,它直接打交道的对象是程序集。程序集由一个或多个托管模块及相关的资源文件逻辑组成。其次,程序集是组件复用,以及实施安全策略和版本策略的最小单位。程序集中有一个托管模块中包含清单(manifest)的数据块,而清单仅仅也是一些元数据表的集合,但是这些表描述了组成程序集所有文件中的公有导出类型,以及一些和程序集相关的资源文件或数据文件。如果程序集只有一个托管模块且没有资源文件,该程序集就是托管模块。
由于CLR不直接和托管模块打交道,所以默认情况下,编译器会将产生的托管模块转换为一个程序集。只有这样程序才能够运行。
托管模块有下列部分组成:
程 序集是CLR操作的对象。程序集由一个或多个托管模块及相关的资源文件逻辑组成。在程序集包含的所有文件中,有一个文件用于保存清单,清单是另外一组元数 据表的集合,其中主要包含了程序集中的一部分文件的名称,另外清单文件还描述了程序集的版本、语言文化、发布者、公有导出类型、以及组成该程序集的所有文 件。CLR总是先加载包含清单元数据表的文件,然后利用该清单来获取程序集中的其它文件。
使用程序集的原因有:
总 而言之,程序集是一个可重用、可实施版本策略和安全策略的单元。它允许我们将类型和资源划分到不同的文件中,这样程序集的使用者便可以决定将哪些文件打包 一起部署。一旦CLR加载了程序集中包含清单的那个文件,它就可以确定程序集中的其他文件中哪些包含了程序正在引用的类型和资源。任何程序集的使用者仅需 要知道包含了清单的文件名。要生成一个程序集,我们必须选择一个托管模块作为清单的保存者。
PS:以上仅为个人愚见,定有不当之处,欢迎指正!当中设计的很多概念也没有深入,以及很多概念也没有引出,如元数据没有深入介绍、FCL也没有一个系统的介绍、未介绍到应用程序域等等。当然要完成这些需要大量篇幅,以后会逐步介绍。