【转载】C#之C#、.NET Framework、CLR的关系

【转载】C#之C#、.NET Framework、CLR的关系

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#的版本之间的对应关系如下表所示:

<span>【转载】C#之C#、.NET Framework、CLR的关系</span>

也就是说,对于那些不涉及新程序集的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文档。

<span>【转载】C#之C#、.NET Framework、CLR的关系</span>

3、CLR(公共语言运行库)在运行期管理程序的执行:主要包含:内存管理、代码安全验证、代码执行、垃圾收集。如下图

(1)自动垃圾收集:CLR有一项服务称为GC(Garbage Collector,垃圾收集),它能为你自动管理内存。

       1)GC自动从内存中删除程序不再访问的对象

       2)GC是程序员不再操心许多以前必须执行的任务,比如释放内存和检查内存泄漏。这可不是小特性,因为检查内存泄漏可能非常困难而且耗时。

<span>【转载】C#之C#、.NET Framework、CLR的关系</span>

4、代码的编译过程:

  (1)编译成CIL:.NET语言的编译器接受源代码文件,并生成名为程序集的输出文件。程序集可以是可执行文件或DLL(如下图所示)

       1>程序集里的代码并不是本机代码,而是一种名称为CIL(Common Intermediate Language,公共中间语言)的中间代码。

       2>程序集包含的信息中,包含下列项目:程序的CIL、程序中使用的类型的元数据、对其他程序集引用的元数据

<span>【转载】C#之C#、.NET Framework、CLR的关系</span>

   (2)编译成本机代码并执行:程序的CIL直到它被调用运行时才会被编译成本机代码。在运行时,CLR执行下面的步骤(如下图)

        1>检查程序集的安全特性

        2>在内存中分配空间

        3>把程序集中的可执行代码发送给实时(Just-in-Time)编译器,把其中的一部分编译成本机代码。  

        程序集中的可执行代码在需要的时候由实时编译器编译,然后它就被缓存以备在后来的程序中执行,使用这个方法意味着不被调用的代码不会被编译成本机代码,而且被调用到的代码只被编译一次。

        一旦CIL被编译成本机代码,CLR就在它运行时管理它,执行像释放无主内存、检查数组边界、检查参数类型和管理异常之类的任务。这里产生了两个重要的术语:

       托管代码:为.NET框架编写的代码称为托管代码,需要CLR。

       非托管代码:不在CLR控制之下运行的代码,比如Win32C/C++ DLL,成为非托管代码。

<span>【转载】C#之C#、.NET Framework、CLR的关系</span>

  (3)编译和执行综述:无论原始源文件的语言是什么,懂遵循同样的编译和执行过程。

<span>【转载】C#之C#、.NET Framework、CLR的关系</span>

【转自】https://www.cnblogs.com/cocoon/p/4997005.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119344.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java判断回文字符串_java将字符串反转输出

    Java判断回文字符串_java将字符串反转输出java判断回文字符串几种简单的实现:1.将字符串倒置后逐一比较,实现如下:publicclassHuiWenTest{/***@SERLIN*/publicstaticvoidmain(String[]args){Stringstr=””;System.out.println(“请输入一个字符串”);Scannerin

    2022年5月3日
    45
  • JavaScript 动画_jquery 动画

    JavaScript 动画_jquery 动画JavaScript—动画一、动画原理通过定时器setInterval不断移动盒子位置。步骤:获得盒子当前位置;让盒子在当前位置加上1个移动距离;利用定时器不断重复这个操作;结束定时器。注意:元素需要加定位。例:HTML代码:<!DOCTYPEhtml><html> <head> <metacharset=”utf-8″/> <title></title> </head>

    2022年10月15日
    0
  • Matlab代码之plot函数的坐标点显示

    Matlab代码之plot函数的坐标点显示plot函数的xlabel、ylabel、title、text、legend1、在图像某个位置显示文字信息,2、用text()显示plot函数的坐标点;3、用legend()在一张图同时显示不同曲线;4、用xlabel()、ylabel()、title()显示横纵坐标和标题;5、用subplot在一张画布上画多个图像;新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个

    2022年10月15日
    0
  • js定时器与延时器_JS做定时器倒计时

    js定时器与延时器_JS做定时器倒计时定时器创建定时器window.setInterval(方法类型,间隔时间(1000=1秒))vartimer=window.setInterval(func,2000);vari=0functionfunc(){console.log(“你好”,i)i+=1}清除定时器window.clearInterval(定时器名)functionting(){//清除定时器window.clearInterval(timer…

    2022年10月21日
    1
  • linux的解压zip文件,linux解压zip文件命令是什么

    linux的解压zip文件,linux解压zip文件命令是什么linux解压zip文件命令是什么发布时间:2020-04-2311:02:45来源:亿速云阅读:162作者:小新今天小编给大家分享的是linux解压zip文件命令是什么,相信很多人都不太了解,为了让大家更加了解linux解压zip文件命令,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。Linuxunzip命令用于解压缩zip文件,unzip为.zip压缩文件的解压缩程序。语法u…

    2022年6月7日
    24
  • eclipse中导入Java文件「建议收藏」

    eclipse中导入Java文件「建议收藏」            eclipse中导入Java文件的方法
     在eclipse中导入Java文件分两种情况:1,如果要导入的Java文件就在eclipse工作空间WorkSpace目录下,则把包含相关Java文件的Java项目导入包资源管理器即可:文件(或者包资源管理器下点击右键)—->导入—->常规—>现有项目到工作空间—>在选择根目录下浏览选择WorkSpace中包含相关Java文件的Java项目,其他不用勾选,点击完成即可;2,如果要导入的Jav

    2022年7月8日
    21

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号