C#、.NET Framework、CLR的关系程序员
不少人没有将C#、.NET Framework(.NET框架)、CLR(Common Language Runtime,公共语言运行库)这三者之间的关系区分清楚,认为其版本号是一一对应的。其实否则,.NET框架是一个独立发布的软件包,其包含了CLR、类库以及相关的语言编辑器等工具。C#代码通过编译以后在CLR环境中运行。因为.NET框架3.0/3.5实际上是.NET2.0的扩展(只是增长了一些新的程序集),因此.NET3.0/3.5的CLR版本仍是2.0.并且.NET3.0其实只扩展了WF、WPF、WCF、WCS等组件,并无提供新的C#编译器,直到.NET3.5中才打包了C#3.0的编译器。.NET4.0在3.0上针对WF、WCF进行了一些新功能增长,因此.NET框架、CLR和C#的版本之间的对应关系以下表所示:编程
也就是说,对于那些不涉及新程序集的C#3.0新特性(好比自动属性、匿名属性等)在.NET2.0的环境中也能够运行,CLR对这些特性是一无所知的。数组
一、C#是一种面向对象编程语言,是为开发.NET框架上的程序而设计的。缓存
(1)C#是由C和C++衍生出来的,因此其可调用由 C/C++ 编写的本机原生函数,同时不损失C/C++原有的强大的功能。安全
(2)C#所开发的程序源代码并非编译成可以直接在操做系统上执行的二进制本地代码。它是被编译成为中间代码,而后经过.NET框架的虚拟机(即CLR)来执行。因此若是计算机上没有安装.Net框架,那么程序将不可以被执行。在执行的过程当中,.Net框架会将中间代码翻译成为二进制机器码,从而使它获得正确的运行。最终翻译的二进制代码将被存储在一个缓冲区中。因此一旦程序使用了相同的代码,那么将会调用缓冲区中的版本。这样若是一个.Net程序第二次被运行,那么这种翻译不须要进行第二次,速度会明显加快。服务器
二、.NET框架有三部分组成(以下图):多线程
1)CLR的介绍参考3框架
2)编程工具:涵盖了编码和调试须要的一切:包含:VisualStudio集成开发环境、.NET兼容的编译器(例如:C#、VB、JScript和托管的C++)、调试器、服务器端改进(好比ASP.NET)编程语言
3)BCL(Base Class Library,基类库):是.NET框架使用的一个大的类库,并且也能够在你的程序中使用。包括如下一些类。编辑器
1>通用基础类:这些类提供了一组极为强大的工具,能够应用带普遍的编程任务中,好比字符串操做、安全和加密。
2>集合类:这些类实现了列表、字典、散列表以及位数组。
3>线程和同步类:这些类用于建立多线程程序。
4>XML类,这些类用于建立、读取以及操做XML文档。
三、CLR(公共语言运行库)在运行期管理程序的执行:主要包含:内存管理、代码安全验证、代码执行、垃圾收集。以下图
(1)自动垃圾收集:CLR有一项服务称为GC(Garbage Collector,垃圾收集),它能为你自动管理内存。
1)GC自动从内存中删除程序再也不访问的对象
2)GC是程序员再也不操心许多之前必须执行的任务,好比释放内存和检查内存泄漏。这可不是小特性,由于检查内存泄漏可能很是困难并且耗时。
四、代码的编译过程:
(1)编译成CIL:.NET语言的编译器接受源代码文件,并生成名为程序集的输出文件。程序集能够是可执行文件或DLL(以下图所示)
1>程序集里的代码并非本机代码,而是一种名称为CIL(Common Intermediate Language,公共中间语言)的中间代码。
2>程序集包含的信息中,包含下列项目:程序的CIL、程序中使用的类型的元数据、对其余程序集引用的元数据
(2)编译成本机代码并执行:程序的CIL直到它被调用运行时才会被编译成本机代码。在运行时,CLR执行下面的步骤(以下图)
1>检查程序集的安全特性
2>在内存中分配空间
3>把程序集中的可执行代码发送给实时(Just-in-Time)编译器,把其中的一部分编译成本机代码。
程序集中的可执行代码在须要的时候由实时编译器编译,而后它就被缓存以备在后来的程序中执行,使用这个方法意味着不被调用的代码不会被编译成本机代码,并且被调用到的代码只被编译一次。
一旦CIL被编译成本机代码,CLR就在它运行时管理它,执行像释放无主内存、检查数组边界、检查参数类型和管理异常之类的任务。这里产生了两个重要的术语:
托管代码:为.NET框架编写的代码称为托管代码,须要CLR。
非托管代码:不在CLR控制之下运行的代码,好比Win32C/C++ DLL,成为非托管代码。
(3)编译和执行综述:不管原始源文件的语言是什么,懂遵循一样的编译和执行过程。