升级.NET Framework不得不说的事 (一):What's it

In computer programming, a software framework is an abstraction in which software providing generic functionality can be selectively changed by additional user-written code, thus providing application-specific software.

1. The definition of Framework

作为一个框架,我认为首先它是能够作为Libarary提供一些公共开发库,供开发人员使用;第二,框架是为开发人员构建应用程序服务的。应用程序代码植入框架中,在运行时被框架代码所调用; 这是识别框架和类库的最大不同。

2. Why .NET Framework

在20世纪末期,微软开发平台下有C、C++等语言,然而它们的开发和运行部署各不一样。为了简化不同语言开发的复杂性、提高开发效率、统一运行部署的问题,并对当下流行的Network一词的响应,微软提出了基于.NET的下一代技术解决方案。NET这个词更多的来自于下一代网络服务(Next Generation Web Service)或者Network of all technologies,从这个词里我们可以看到当时微软对于.NET的雄心壮志。

“.NET is a brilliant strategy that enables Microsoft to define the next shift in the software business.”

“Gartner believes Microsoft is now providing more vision and influence regarding this shift than any other vendor.”
—Gartner Group

3. What’s .NET Framework

{:height=”300px” width=”400px”}

.Net Framework is the collection of Assemblies to support the .Net application development and .Net application execution, it is language neutral and more than that.

.NET Framework(简称.NET)是微软开发的一个用来构建基于Windows应用程序的统一平台。它包括公共语言运行时 (CLR) 和 .NET Framework 类库。 2000年末发布了第一个版本,2013年发布4.5.1,至今已有十多年的历史。

3.1公共语言运行时(CLR)

It is a virtual machine component of the Microsoft’s .NET framework and is responsible for managing the execution of .NET programs

CLR即公共语言运行时,与JAVA世界里的JVM对等,它的主要职责是加载定位和管理.NET的运行程序,同时还承担管理内存、实时编译(JIT Compiler)、安全检查、垃圾回收、异常处理、线程等职责。这里的公共语言一词指的是CLR是面向微软中间语言(MSIL),而不是面向某一门具体的开发语言,比如C#、C等,从而保证了它能够实现统一运行环境。

3.1.1 程序集=清单+元数据+中间语言

程序集或是exe可执行文件或是dll文件,程序集里面包含清单(Manifest)、元数据(Metadata)和中间语言(MSIL)。

清单相当于一个目录,描述了程序集本身的信息,例如程序集标识(名称、版本、文化)、程序集包含的资源(Resources)、组成程序集的文件等。

元数据包括程序集包含的模块、类型、类型的成员、类型和类型成员的可见性等。元数据并不包含类型的实现,有点类似于C++中的.h头文件。如果说清单描述了程序集自身的信息,那么元数据则描述了程序集所包含的内容。运行时查看元数据的过程称为反射。

MSIL中间语言是与CPU无关的机器语言,以MSIL为编码的程序集都可以在CLR中运行,这就使得编程语言以及编译器和运行环境分离开来。编译器只要将源代码编译成面向中间语言的就可以了。在CLR中可以支持这些编译器所创建出来的程序集或者程序集组合,这些也称为托管代码。如果用设计模式来理解中间语言的话,更像是一个适配不同开发语言的Adapter层。

为了帮助开发者查看程序集的信息,微软提供了IL DASM(IL Disassembler,IL反汇编程序)工具。如果安装了Visual Studio,IL DASM将会随同Visual Studio一起安装,包含在 Microsoft Windows SDK Tools中。

3.1.2 公共类型系统(CTS)/公共语言规法(CLS)

CTS和CLS是CLR的核心。CTS是一种类型系统和语言规范,它能够确保CLR能够识别和处理的类型,所有.NET开发语言中的类型,无论时VS.NET类型还是C#.NET类型最终都会被编译成CLR能够识别的CTS类型,因此CTS是.NET平台类型的抽象,满足这套规则的语言就称为面向.NET框架的开发语言,从而能够由编译器生成中间语言代码。例如VB.NET中的integer类型和C#中的int类型都编译成CTS的System.Int32类型,它们只不过是微软开发的一套符合CTS规范的语言,还存在Delphi.NET等其它符合CTS规范的语言,也可以将自身的类型编译成符合CTS规范的类型,从而能够在CLR中运行。如果某种语言编写的程序能够在CLR上运行,并不能说明这种语言完全符合CTS的规范。例如使用C++编写的代码,部分代码并不符合CTS规范,在编译时把这部分不符合CTS的代码会被编译成原始代码本地CPU指令而非中间代码。

.NET的运行环境是无关开发语言的,不仅可以运行C#构建的程序集,而且可以运行VB.NET构建的程序集。那么运行在统一环境下的不同语言构建的程序集就有可能产生互相调用的需求,比如C#编写程序时可以直接引用并使用VB.NET编写的类库。为了达到这样的交互,制定出一个新的规范:CLS规范来定义一些常见的、大多数语言都共有的语言特性,只要这些语言实现的公开部分能够满足这些规范,就能够被其他语言的程序集所使用。这个规范就叫做CLS (Common Language Specification,公共语言规范)。CLS是CTS的一个子集,所有.NET语言都应该遵循此规则才能创建与其他语言可互操作的应用程序,它是在.NET平台上运行语言的最小规范。在.NET框架本身提供的所有类库(并非所有)都是与CLS兼容的,在查看MSDN文档时,不兼容的类和方法都被特别标记为不兼容,例如C#中的System.UInt32就标记为”此API不兼容CLS。兼容 CLS的替代API为 Int64。“,这说明并不是所有的语言(例如VB.NET或J#)都支持无符号的数据类型,但这种数据类型与CLS不兼容的。

3.1.3 编译

{:height=”300px” width=”400px”}

上图摘自Reference[7].一段开发代码能够在CLR中运行有两个阶段的编译,一是静态代码编译,这时需要CLS编译器负责将源代码编译成程序集,写入元数据和中间语言信息。二是运行时,由CLR中实时编译器(JIT Compiler)要将这些程序集中的中间语言根据元数据信息编译成机器指令。它只在需要执行程序集的时候才会进行,所以是Just In Time编译器。

3.1.4 托管

托管意味着程序集不能够独立运行,须委托给CLR进行运行和管理,并由CLR处理内存、线程等其他事项。托管模块和托管代码(即MSIL代码)就是这个意思。而非托管代码,即可以独立于CLR运行的代码,比如C的运行程序集,这些代码则需要自己处理内存等其它事项。

3.1.5 CLR与操作系统,

CLR运行会占用在操作系统的一个进程,对于多个托管的应用程序集,CLR中的AppDomain来负责管理,每个托管的应用程序有自己的独立地址空间,可以在一个AppDomain中执行。

3.1.6 CLR加载程序集

程序集分为两类exe文件或者dll文件。exe文件运行在操作系统的进程中,所以当启动exe时,Windows操作系统会根据exe文件的CLR头信息进行判断是否32位或64位,然后加载响应的CLR环境。对于dll则是不同的,因为dll的加载时在CLR中发生的,那么这个时候CLR的环境已经确定,CLR会根据dll的元数据信息进行加载,如果出现环境不匹配的情况就会由CLR进行异常处理。

3.2 基本类库

3.2.1 基础类库(Base Class Library)

BCL是公共编程框架,称为基类库,主要包括:执行网络操作,执行I/O操作,安全管理,文本操作,数据库操作,XML操作,与事件日志交互,跟踪和一些诊断操作,提供基础支持。

3.2.2 框架类库(Framework Class Library)

FCL提供了大粒度的编程框架,它是针对不同应用设计的框架 ,FCL大部分实现都基于BCL,如ASP.NET、MVC、WCF和WPF等等,提供了针对不同层面的编程框架 。

3.2.3 ADO.NET

指数据和XML处理的库。

4. 公共语言基础(Common Language Infrastructure)

.net Framework是CLI在Windows操作平台的一个具体实现,Mono是CLI的另一个实现,目标是将.NET框架多平台化,使其可以运行在各种平台上,包括Mac OS、Linux等。

5. 概念解释

概念 描述
CLR Common Language Runtime, it is almost same as JVM
CTS Common Type System
CLS Common Lanaguage Specification
MSIL Intermediate Language,similar as .class file(byte code) in java, but IL is more powerful. It is CLR’s language.
Assembly DLL or exe file + Metadata, it is self-descibed with meta information embedded inside and IL. There are two types of assembly, weakly named assembly and strongly named assembly. The difference is strongly named assembly will be signed to avoid modification by hackers. It does have four aspects, Name, Version, signature, inside meta to identify it is the original assembly.
JIT compiler compile a method’s IL code into native CPU instructions
Managed Module this module will be managed by CLR not itself
Un-managed Module/Assembly this module or assembly will run by themselves, such as exe file compiled by previous compiler/com component that could access operating system directly
Global Assembly Cache a place that shared assembly is installed

6. Reference

  1. List_of_.NET_Framework_versions

  2. .NET Framework 入门

  3. Why-NET-is-NET

  4. the-atom-of-the-net-framework

  5. DotNet-Framework

  6. 关于CLR、CIL、CTS、CLS、CLI、BCL和FCL

Share Comments