C#之C#、.NET Framework、CLR的关系
转自 https://www.cnblogs.com/cocoon/p/4997005.html
补补基础:
很多人没有将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对这些特性是一无所知的。
1、C#是一种面向对象编程语言,是为开发.NET框架上的程序而设计的。
(1)C#是由C和C++衍生出来的,所以其可调用由 C/C++ 编写的本机原生函数,同时不损失C/C++原有的强大的功能。
(2)C#所开发的程序源代码并不是编译成能够直接在操作系统上执行的二进制本地代码。它是被编译成为中间代码,然后通过.NET框架的虚拟机(即CLR)来执行。所以如果计算机上没有安装.Net框架,那么程序将不能够被执行。在执行的过程中,.Net框架会将中间代码翻译成为二进制机器码,从而使它得到正确的运行。最终翻译的二进制代码将被存储在一个缓冲区中。所以一旦程序使用了相同的代码,那么将会调用缓冲区中的版本。这样如果一个.Net程序第二次被运行,那么这种翻译不需要进行第二次,速度会明显加快。
2、.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文档。
3、CLR(公共语言运行库)在运行期管理程序的执行:主要包含:内存管理、代码安全验证、代码执行、垃圾收集。如下图
(1)自动垃圾收集:CLR有一项服务称为GC(Garbage Collector,垃圾收集),它能为你自动管理内存。
1)GC自动从内存中删除程序不再访问的对象
2)GC是程序员不再操心许多以前必须执行的任务,比如释放内存和检查内存泄漏。这可不是小特性,因为检查内存泄漏可能非常困难而且耗时。
4、代码的编译过程:
(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)编译和执行综述:无论原始源文件的语言是什么,懂遵循同样的编译和执行过程。
C#之C#、.NET Framework、CLR的关系的更多相关文章
- 【转载】C#之C#、.NET Framework、CLR的关系
C#..NET Framework.CLR的关系 很多人没有将C#..NET Framework(.NET框架).CLR(Common Language Runtime,公共语言运行库)这三者之间的关 ...
- .NET Core 和 .NET Framework 之间的关系
引用一段描述:Understanding the relationship between .NET Core and the .NET Framework. .NET Core and the .N ...
- [转]Entity Framework 的实体关系
通过 Entiy Framework实践系列 文章,理了理 Entity Framework 的实体关系. 为什么要写文章来理清这些关系?“血”的教训啊,刚开始使用 Entity Framework ...
- C#、.NET Framework、CLR的关系
很多人没有将C#..NET Framework(.NET框架).CLR(Common Language Runtime,公共语言运行库)这三者之间的关系区分清楚,认为其版本号是一一对应的.其实不然,. ...
- 关于ASP.NET与CLR相互关系的一些总结
原文地址:http://www.cnblogs.com/jasenkin/archive/2010/10/20/asp-net-clr-relation.html CLR(COM服务器) CLR作为一 ...
- .Net 初步学习笔记之一——.Net 平台与.Net FrameWork框架的关系
.Net 包含两部分 .Net平台 和.Net FrameWork 框架 1..Net FrameWork框架包含于.Net平台. .Net FrameWork提供环境和支撑保证.Net平台运行. 2 ...
- Entity Framework Code First关系映射约定
本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...
- EF(Entity Framework)多对多关系下用LINQ实现"NOT IN"查询
这是今天在实际开发中遇到的一个问题,需求是查询未分类的博文列表(未加入任何分类的博文),之前是通过存储过程实现的,今天用EF实现了,在这篇博文中记录一下. 博文的实体类BlogPost是这样定义的: ...
- Entity Framework一对多关系添加数据的两种方式
当使用Entity Framework添加一对多关系数据的时候,通常先添加一的数据,然后再添加多的数据.类似这样: //添加一的数据 var category = new Category{Name= ...
随机推荐
- 【已采纳】最快获取package和activity的方式
意外找到一个本人自认为是最快获取package和activity的方法,欢迎来辩! 用adb命令快速查看某应用appPackage及appActivity的方法(前提是需要用数据线连接真机\模拟器也可 ...
- DVWA 黑客攻防实战(十五) 绕过内容安全策略 Content Security Policy (CSP) Bypass
看到标题,是否有点疑惑 CPS 是什么东东.简单介绍一下就是浏览器的安全策略,如果 标签,或者是服务器中返回 HTTP 头中有 Content-Security-Policy 标签 ,浏览器会根据标签 ...
- Hive分桶
1.简介 分桶表是对列值取哈希值的方式将不同数据放到不同文件中进行存储.对于hive中每一个表,分区都可以进一步进行分桶.由列的哈希值除以桶的个数来决定数据划分到哪个桶里. 2.适用场景 1.数据抽样 ...
- Spark MLlib FPGrowth关联规则算法
一.简介 FPGrowth算法是关联分析算法,它采取如下分治策略:将提供频繁项集的数据库压缩到一棵频繁模式树(FP-tree),但仍保留项集关联信息.在算法中使用了一种称为频繁模式树(Frequent ...
- pyspider+PhantomJS的代理设置
环境:pyspider0.3.9 PhantomJS2.1.1,均为最新版 进程用supervisor托管的. 其中需要加的几个地方: webui进程: pyspider -c config.json ...
- C# -- 使用Ping检查网络是否正常
C# -- 使用Ping检查网络是否正常 需引用命名空间: using System.Net.NetworkInformation; 1. 代码实现 try { List<string> ...
- Socket网络编程(案例)
Socket:套接字 java.net包 1.流式套接字:基于TCP协议的Socket网络编程 工作方式: 1.客户端A连接到服务器: 2.服务器建立连接并把客户端A添加到列表: 3.客户端B.C.. ...
- [题解]ybt1365:FBI树(fbi)
ybt1365:FBI树(fbi) [题目描述] 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串. FBI树是一种二叉树,它 ...
- UnityEditorWindow自建窗口扩展
这里主要记录UnityEditorWindow的创建,以及常用的API接口样式 1,创建UnityEditorWindow 在Unity目录中,创建一个名为Editor的文件夹(任何位置),然后创建如 ...
- Python之常用第三方库总结
在使用python进行开发的时候,经常我们需要借助一些第三方库,进行日常代码的开发工作.这里总结一些常用的类库 1. requests Requests 是用Python语言编写,基于 urllib, ...