CLR 这些年有啥变化吗?

引言

首先想给初学者推荐下《CLR via C#》这本好书,做.Net开发的开发者应该都读一下。不说原因啦,也是为了做广告。这里提供豆瓣书评的链接。

CLR 作为.Net 程序跨平台运行的载体,和Java的JVM有着类似的功能(JAVA为跨平台而生,实现这一目标离不开JVM)。

随着.NET Framework的日益发展CLR也有日新月异的变化。这些变化为开发带来更多有用的特性,在提高开发效率的同时也提高了程序的性能和稳定性。

 

如果大家觉得还有必要把这块更新的更好,还请多多反馈。

如果觉的对您有用还请点击 “推荐”下,我会持续更新更多新的内容。

CLR是什么

通用语言运行时(CommonLanguageRuntiome,CLR)最早被称为下一代Windows服务运行时(NGWS Runtime).它是直接建立在操作系统上的一个虚拟环境,主要的任务是管理代码的运行。

CLR在.NetFramework中的位置

 

.NET平台结构图

 

CLR现在支持几十种现代的编程语言为它编写代码,然后以一种中间语言(Intermediate Langeoage,IL)代码的形成被执行。并且,CLR还提供了许多功能以简化代码的开发和应用配置,同时也改善了应用程序的可靠性。如你所知,如果某种语言的编译器是以运行时为目标的,那么利用该语言开发生成的代码在.NET中被称为托管代码(MSIL),因为这样的代码是直接运行在CLR上的,所以具有与平台无关的特点。

 

目前有哪些语言支持CLR

微软已经为多种语言开发了基于CLR的编译器,这些语言包括:C++/CLI、C#、Visual Basic、F#、Iron Python、 Iron Ruby和IL。

除此之外,其他的一些公司和大学等机构也位一些语言开发了基于CLR的编译器,例如Ada、APL、Caml、COBOL、Eiffel、Forth、Fortran、Haskell、Lexicon、LISP、LOGO、Lua、Mercury、ML、Mondrian、Oberon、Pascal、Perl、PHP、Prolog、RPG、Scheme、Smaltak、Tcl/Tk。

 

 

在.NET平台结构图中,CLR的上面是.NET的基类库,这组基类库包括从基本输入输出到数据访问等各方面,提供了一个统一的面向对象的,层次化的,可扩展的编程接口。从.NET平台结构图中也可以看到,基类库可以被各种语言调用和扩展,也就是说不管是 C#,VB.NET还是F#,VC++.NET,都可以自由的调用.NET的类库。

CLR内部结构

 

 

从上图可以看到CLR提供的功能,如类型安全(Type Checker)、垃圾回收(Garbage Collector)、异常处理(Exception Manager)、向下兼容(COM Marshaler)等,具体的说,.NET上的CLR为开发者提供如下的服务:

  • 平台无关:CLR实际上是提供了一项使用了虚拟机技术的产品,他在操作系统之上,并不要求程序的运行平台是 Windows系统,只要是能够支持它的运行库的系统,都可以在上面运行.NET应用。所以,一个完全由托管代码组成的应用程序,只要编译一次,就可以在任何支持.NET的平台上运行.(从Mono的出现变得更加真实啦,不用在羡慕JAVA啦)
  • 跨语言集成:CLR语序开发这以任何语言进行开发,用这些语言开发的代码,可以在CLR环境下紧密无缝的进行交叉调用,例如,可以用VB声明一个基类对象,然后在C#代码中直接创建次基类的派生类。
  • 自动内存管理:CLR提供了拉架收集机制,可以自动管理内存。当对象或变量的生命周期结速后,CLR会自动释放他们所占用的内存.
  • 跨语言异常处理
  • 版本控制(避免了DLL灾难)
  • .NET安全
  • 简单的组件互操作性
  • 自描述组件:自描述组件是指将所有数据和代码都放在一个文件中的执行文件。自描述组件可以大大简化系统的开发和配置,并且改进系统的可靠性。

 

CLR 执行示意图

 

CLR 在整个.Net Framework 程序执行过程的模型,C#、VB.Net,C++.Net 代码通过编译器生成了MSIL(托管代码),然后CLR用JIT翻译成native code ,最后就可以直接执行啦。

 

 

CLR 版本发展史

 

C#版本 和.Net Framework 版本以及CLR依赖关系 和新特性添加列表,

 

The .NET Framework 4.5 is an in-place update that replaces the .NET Framework 4 on your computer, and similiarly, the .NET Framework 4.5.1 4.5.2, and 4.6 RC are in-place updates to the .NET Framework 4.5, which means that they use the same runtime version, but the assembly versions are updated and include new types and members. After you install one of these updates, your .NET Framework 4 or .NET Framework 4.5 apps should continue to run without requiring recompilation. However, the reverse is not true. We do not recommend running apps that target a later version of the .NET Framework on the .NET Framework 4.5.

上面的总体意思就是:

  • .NET Framework 4.5 是.NetFramework 4.0的代替者
  • .NET Framework 4.5.1 4.5.2, and 4.6 RC 是.NetFramework 4.5的代替者

从.net 4 开始,如果您想把.NetFramework 4.0+ 到更新的更新版本的.NetFramework,只需重新指定目标.Net Framwork然后重新编译代码即可,反之不可行。

之所以可以这样做是因为这几个.NetFramework版本的CLR都是4.0版本的。

The .NET Framework versions 2.0, 3.0, and 3.5 are built with the same version of the CLR (CLR 2.0). These versions represent successive layers of a single installation. Each version is built incrementally on top of the earlier versions. It is not possible to run versions 2.0, 3.0, and 3.5 side by side on a computer. When you install version 3.5, you get the 2.0 and 3.0 layers automatically, and apps that were built for versions 2.0, 3.0, and 3.5 can all run on version 3.5. However, the .NET Framework 4 ends this layering approach. Starting with the .NET Framework 4, you can use in-process side-by-side hosting to run multiple versions of the CLR in a single process. For more information, see Assemblies and Side-by-Side Execution.

In addition, if your app targets version 2.0, 3.0, or 3.5, your users may be required to enable the .NET Framework 3.5 on a Windows 8 or Windows 8.1 computer before they can run your app. For more information, see Installing the .NET Framework 3.5 on Windows 8 or 8.1

这段话的意思是

  • .NET Framework versions 2.0, 3.0, and 3.5 每个版本都是在前一个版本基础上增量开发的
  • .NET Framework versions 2.0, 3.0, and 3.5 不同版本的程序不能在同一机器上同时运行在不同CLR上。(在安装 3.5 版后,你将无需安装 2.0 和 3.0 版本,2.0、3.0 和 3.5 生成的应用程序均可在 3.5 版上运行)
  • 从 .NET Framework 4 开始,在单个进程中可使用进程内并行运行在多个版本的CLR 。(即4.0的dll引用了2.0的dll是,4.0的代码在CLR4.0上运行而2.0的代码运行在CLR2.0上)
  • 此外,如果你的应用程序使用的是 2.0、3.0 或 3.5 版,你的用户可能需要先在 Windows 8 或 Windows 8.1计算机上启用 .NET Framework 3.5,然后才能运行应用程序。

 

顺便看下 各个.Net Framework 新功能:

 

CLR最新发展

未来.NEtFrameWork 会有新的兄弟进来一起构建.Net 跨平台和云架构的梦想。

上图中Core CLR是Asp .Net vNext很重要的核心之一,虽然官方没说,但基本上就是一个精简版的CLR,拿掉了绘图等功能,让Server和Cloud程序更高效

至于MonoCLR,大家看名字就知道是为了更好的支持Mono这个开源的新秀的。

 

参考

公共语言运行时 (CLR)

.NET Framework Versions and Dependencies

The Future of .NET in the Server: ASP.NET vNext optimized for Cloud and Server workloads

.NET Versioning and Multi-Targeting - .NET 4.5 is an in-place upgrade to .NET 4.0

时间: 2024-10-26 21:34:28

CLR 这些年有啥变化吗?的相关文章

Atitit. C#.net clr 2.0  4.0新特性

Atitit. C#.net clr 2.0  4.0新特性 1. CLR内部结构1 2. CLR 版本发展史3 3. CLR 2.0 3 4. CLR 4 新特性 概览4 4.1.1.  托管与本地代码的互操作5 4.1.2.    垃圾回收6 4.1.3.    代码约定6 4.1.4.    Corrupted state exception6 4.1.5.     新的安全模型7 4.1.6.     同一个进程,多个CLR7 4.1.7.     基本类库7 5. CLR最新发展8 6

python 学习爬虫教程~

思路:: (本文没有用xpath定位,xpath需要导入第三方库   from lxml import etree) 1.首先通过urllib类获取到网页的所有内容 2.通过partition获取其中的部分内容 3.在通过指定内容放到放到一个list中1! 代码如下: #encoding: utf-8 import urllib, os # 获取网页内容 def getContent(urlAddr): page = urllib.urlopen(urlAddr) html = page.rea

Atitit..net clr il指令集 以及指令分类  与指令详细说明

Atitit..net clr il指令集 以及指令分类  与指令详细说明 1.1. .NET CLR 和 Java VM 都是堆叠式虚拟机器(Stack-Based VM), 1 1.2. 查看工具ILDASM1 1.3. 此程式执行时,关键的记忆体有三种,分別是:1 1.4. Il指令集2 1.4.1. Mov指令3 1.4.2.  跳转指令集合6 1.4.3.  算术 逻辑 与移位指令8 1.4.4. 类型转换9 1.4.5. Other  and oo指令10 2. 参考12 1.1. 

CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段

编程语言的基元类型 某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们. System.Int32 a = new System.Int32();  // a = 0 a = 1; 等价于: int a = 1; 这种语法不仅增强了代码的可读性,其生成的IL代码与使用System.Int32时生成的IL代码是完全一致的. 编译器直接支持的数据类型称为基元类型(primitive type).基元类型直接映射到Framework类库(FCL)中存在的类型.如C#中,int直接映射

读书笔记—CLR via C#委托和attribute

前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可以加深自己理解的深度,当然同时也和技术社区的朋友们共享 委托 类型安全的回调函数,函数签名定义声明.指向静态或实例方法 派生自System.MulticastDelegate的类 将方法绑定到委托时,C#和CLR都允许引用类型的协变性和逆变性 协变性指方法能返回从委托的返回类型派生的类型 逆变性是指

托管C++、C++/CLI、CLR

1.什么是托管C++? 在回答这个问题,首先要搞清楚什么是"托管"(Managed).托管是.NET的一个专门概念,它是融于通用语言运行时(CLR)中的一种新的编程理念,因此我们完全可以把"托管"视为".NET".那么什么是"通用语言运行时"?通用语言运行时是.NET 框架应用程序的执行引挚.它提供了许多服务,其中包括:代码管理(装入和执行).类型安全性验证.元数据(高级类型信息)访问.为管理对象管理内存.管理代码,COM对象

[C#]CLR via C#研习系列:动态基元类型和动态的C#

今天读到了<CLR via C#>中动态基元类型的章节,恰好刚刚在候选区看到了一篇<为什么可以说Java语言是准动态语言?>的文章,其文中说Java依赖反射可以称为'准动态语言',而C#是静态语言. 我先不说结论,先来看一下什么是动态语言. 引用互动百科的词条: 动态语言,准确地说,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化.比如众所周知的ECMAScript(JavaScript)便是一个动态语言.除此之外如Ruby.Python等也

ASP.NET vNext总结:CLR

1.前言 1.1感慨 2015年来了,园子里多了一些<年总结>类的帖子,颇有感触.俺没啥文化,出来打工10年了,人生能有几个10年?命长的话,活个70岁古来稀就知足了.期间换三个职业,N家单位吧,如今真正选择做一名程序员,也有一年时间了.我也不想提及为何成了苦逼的程序员?反正我必须承认这些年来混得挺失败的. 不管是工作上写过年终结,职业规划,就连人生也写过感悟,生活理想.可事实上,写过又能怎样?人的成长是不断变化的,过去的想法,在下一时期,可能又不认同了.还有计划跟不上变化的,这看似是在为没有

CTS、CLS、CLR

CTS 一个给定的程序集可能包含任意数量的不同"类型".在.NET领域,类型(type)是一个一般性的术语,它指的是集合{类,接口,结构,枚举,委托}里的任意一个成员.当用支持.NET的语言构建解决方案时,很有可能要与这些类型打交道.例如,程序集可能定义了一个类,它又实现了一些接口.或许其中某个接口方法采用枚举类型作为输入参数,而在调用时返回一个结构. CTS(公共类型系统)是一个正式的规范,它规定了类型必须如何定义才能被CLR承载.通常,只有那些创建针对.NET平台的工具或编译器的人