1.3 C#与.NET框架
经常有人将C#和.NET框架混淆,C#是编程语言,而.NET框架是一个完整的编程框架。.NET框架除了提供C#编程语言之外,还提供了一系列函数库与工具集,以辅助程序员更快地开发程序。它们的关系如图1-11所示。
图1-11 C#与.NET框架的关系
.NET框架里包含很多独立的模块,大致可以分成三大类型:公共语言运行时(Common Language Runtime,CLR)、编程语言和代码库。
1. 公共语言运行时
公共语言运行时模块类似Java语言里的虚拟机(JVM)。公共语言运行时负责执行托管代码(Managed Code),C#只是支持编译生成托管代码的众多编程语言之一。托管代码一般以装配件(Assembly)的形式打包,作为可执行文件(.exe后缀)和代码库(.dll后缀)存放在文件系统里。
托管代码以MSIL中间语言,而不是机器代码保存在装配件中。除此之外,装配件还保存了关于代码的元数据信息,如定义在其内的类型、函数、事件、属性、安全要求等信息。有了这些信息,当CLR加载并准备执行托管程序时,会准备一个托管运行环境来执行类型安全验证、安全策略验证、数组访问边界检查、异常处理和内存垃圾回收等操作,从而避免程序的一些安全漏洞或者稳定性问题。
与托管代码对应的就是非托管代码,非托管代码一般是指C/C++等直接编译成机器代码的代码,因为在编译过程中缺失了大量关于程序信息的元数据,所以CLR无法控制程序的执行。
CLR有一个完整的规范——公共语言基础架构(Common Language Infrastructure,CLI)。只要基于这个规范,托管程序就可以无缝移植到新的操作系统上。
2. 编程语言
CLR本身是语言中立的,只负责执行MSIL形式的代码。C#、Visual Basic.NET和Managed C++等多种编程语言的编译器只需要将源代码编译成MSIL代码,具体的执行工作由CLR完成。这样不仅能跨平台运行.NET程序,而且不同编程语言编写的程序可以互相调用。
3. 代码库
仅有编程语言是不能完成程序的编写工作的,还需要代码库的支持。这就好比建造一栋楼房,仅有水泥(编程语言)是不够的,还需要砖头(代码库)才能实施。.NET框架自带非常丰富的代码库,这里做一个简单的介绍。
1)基础类库(Basic Class Library,BCL):跟C/C++语言里的标准库类似,其是.NET框架的基础类库,也是CLI的一部分。其提供了表现CLI内置数据类型(如int、double等)的类、基本的文件处理、I/O流、字符串处理等最基本的功能。
2)ADO.NET:.NET自带对自家SQL Server、Access等数据库的支持,其他主流数据库(如Oracle、DB2、MySQL等SQL数据库)以及MongoDB等NoSQL数据库都提供了相应的ADO.NET驱动,以便.NET程序访问。Entity Framework类库基于ADO.NET提供的数据访问功能,实现了现代编程中常用的对象关系映射(Object Relational Mapping,ORM)功能。
3)Windows通信开发平台(Windows Communication Foundation,WCF):整合了原有Windows通信平台上的.net remoting Web服务、Socket等远程跨进程通信机制,并融合了HTTP和FTP等相关技术,是.NET上开发SOA程序的重要框架。
4)Windows工作流开发平台(Windows Workflow Foundation,WWF):编程流程化业务系统的重要框架,提供了描述工作流中顺序执行每个节点和节点之间相互依赖关系的方法,可以用来实现很多商业流程(如审批流程)的开发。
5)托管可扩展性编程框架(Managed Extensibility Framework,MEF):.NET平台下的一个扩展管理框架,便于程序员在对已有代码产生最小影响的前提下对应用程序进行扩展。
6)Windows界面开发框架(Windows Presentation Framework,WPF):在Windows平台下构建桌面程序的重要框架。
7)WinRT:统一Windows平台(Universal Windows Platform,UWP)的核心,为应用程序提供了跨多种Windows设备的统一编程接口。这些Windows设备是指PC、平板、HoloLens、Windows Phone、Xbox等所有运行Windows操作系统的设备。
8)ASP.NET:.NET平台上开发网站应用的框架,支持如Web网站、WebSocket、Web服务、RESTful API等多种形式的网络应用的开发。
注意:.NET框架,包括CLR、C#编译器、ASP.NET等多种模块都已经开放源码,而且随着源码开放的还有丰富的文档,有兴趣的读者可以去官网(http://www.dotnetfoundation.org/)学习。