1.2 .NET Framework
在提到.NET时,通常指的是.NET Framework框架,是微软公司为开发应用程序而创建的一个具有革命意义的平台。而C#是一种编程语言,可以开发基于.NET平台的应用。
1.2.1 .NET Framework发展史
C#语言本身是为了配合微软的.NET Framework战略推出的,因此它的发展一直与.NET Framework的发展相辅相成。
1. .NET Framework 1.0
.NET Framework 1.0发布于2002年,是.NET最早的一个版本,是第一个微软Visual Studio .NET的发行版的一部分,可以以一个独立且可重新分发的包的形式或在一个软件发展工具包集中被获得,不能安装在用户操作系统和服务器操作系统上。
2. .NET Framework 1.1
.NET Framework 1.1是对1.0框架的升级版本,发行于2003年,包含在Visual Studio 2003中。相对于1.0版本的改进,自带了对Mobile ASP.NET控件的支持,安全方面使Windows窗体代码以可靠的行为运行,从而可以在Internet环境内安全运行,并且加入了ASP.NET应用程序的代码安全访问功能。自带了对ODBC和Oracle数据库的支持。同时新增了.NET Compact Framework技术,用于智能设备。
3. .NET Framework 2.0
.NET Framework 2.0发行于2005年10月27日。它的组件都包含在Visual Studio 2005和SQL Server 2005里面。全新的改进,独立于之前的任何一个版本,首次实现了对64位平台的支持,在很多程序中所用到的功能,基本上2.0版本都提供了技术支持。
4. .NET Framework 3.0
.NET Framework 3.0发布于2006年11月21日,曾用名“WinFX”,加入了适应未来软件发展方向的4个框架。
(1)Windows Presentation Foundation(WPF):提供更佳的用户体验,用来开发Windows Forms程序以及浏览器应用程序,主要是用于表现层UI。
(2)Windows Communication Foundation(WCF):提供SOA(面向服务的软件构架)支持的安全的网络服务框架,主要解决程序之间的通信问题。
(3)Windows Workflow Foundation(WWF):提供一个设计与发展工作流程导向应用程序基础支持的应用程序接口,主要是控制程序之间的逻辑转换。
(4)Windows CardSpace:提供一个SSO(单点登录)的解决方案,每个用户都有各自的CardSpace。
5. .NET Framework 3.5
.NET Framework 3.5随Visual Studio 2008一起发布,现在还具有很强大的生命力,功能相对2.0增加了不少。安装包已包含.NET Framework 3.5和.NET Framework 3.0 SP1,语言中新增LINQ、AJAX、局部var关键字、自动属性(直接写get和set)、匿名类型、对象与集合初始化器、扩展方法和Lambda表达式,新增ADO.NET Entity Framework数据访问框架,添加两个新的程序集System.Web.Abstraction.dll和System.Web.Routing.dll。
6. .NET Framework 4.0
.NET Framework 4.0发布于2010年4月12日,它与Framework 3.5 SP1并行工作。在旧版的.NET Framework中可以运行的应用程序,将继续能够在.NET Framework 4.0上运行。Visual Studio 2010正式版中内置对ASP.NET MVC 2的支持,不需要再另外安装。
7. .NET Framework 4.7
.NET Framework 4.7发布于2017年4月5日,与之对应的开发工具是Visual Studio 2017。该版本是通过Windows 10 Anniversary Update发布,支持Windows 7 SP1及以上版本,其中提供了一些新的特性,包括对C#和VB15的支持,一些软件缺陷的修正,以及更大程度上的加密支持。
1.2.2 .NET Framework的组成
.NET Framework是由微软公司推出的一种完全面向对象的软件开发平台,它主要由两个组件构成,分别为公共语言运行库(CLR)和.NET Framework类库,如图1-2所示。
图1-2 .NET Framework的组成
公共语言运行库是.NET Framework的基础。用户可以将运行库看作一个执行时的管理环境,它提供内存管理、线程管理和远程处理等核心服务。通常在CLR中运行的代码称为托管代码(Managed Code),它主要有两个作用:
(1)与操作系统进行交互,让用户的程序可以在操作系统里面执行响应。
(2)统一数据类型和统一语言语法,原因是.NET框架上有不止C#一种语言,其中还包括VC++、VC.NET等,这些语言编写的程序其实最后都会在公共语言运行库这边翻译成统一的语言(这就是中间语言IL),然后与操作系统进行相关的交互。
.NET Framework的另一个主要组件是类库,它是一个综合性的面向对象的可重用类型集合,用户可以使用它开发多种应用程序,这些应用程序包括传统的命令行或图形用户界面(GUI)应用程序,也包括基于ASP.NET所提供的最新创新的应用程序,如Web Forms、XML和Web Services等。
1.2.3 C#与.NET Framework
每一种编程语言,要想执行,就必须要转换为目标操作系统能够理解的语言才能执行,这种语言叫做本机代码。C#也是一样的,也要做这样的转换,但是它不是一步到位的,在.NET Framework这个平台下,该过程分为以下两个阶段。
1. 编译
在编译C#代码时,并不是立即创建本地代码,而是通过C#编译器把代码编译为通用中间语言(Common Intermediate Language,CIL)代码,也就是IL代码,并将其存储在一个程序集中。
注意:在C#中,程序集分为两种,扩展名为.exe的可执行文件和扩展名为.dll的可供其他程序调用的库文件。
2. 执行
执行C#程序时,程序集将加载到CLR中。要使代码能够在目标操作系统上运行,还需要进一步把CIL代码转换为特定CPU的本机代码,该过程是由即时编译器(Just In Time,JIT)来完成的。CLR还提供与自动垃圾回收、异常处理和资源管理有关的其他服务。由CLR执行的代码有时称为“托管代码”,与之相对应的是编译为面向特定系统的本机机器语言的“非托管代码”。
关于C#源代码的编译与执行,如图1-3所示。
在JIT编译生成本机代码之后,编译好的本机代码会被存储在一个缓冲区中缓存,下次调用相同的程序集时,可直接从缓冲区中获取本机代码,从而避免了二次验证和编译。这样的使用方式,系统只在首次调用时才会造成一些性能损失(JIT编译过程),所以C#程序在第一次调用的时候,会明显感觉慢一些。
图1-3 C#源代码的编译与执行