CLR 这些年有啥变化吗?
引言
首先想给初学者推荐下《CLR via C#》这本好书,做.Net开发的开发者应该都读一下。为避免广告之嫌,所以这里只提供豆瓣书评的链接。
CLR 作为.Net 程序跨平台运行的载体,和Java的JVM有着类似的功能(JAVA为跨平台而生,实现这一目标离不开JVM)。
随着.NET Framework的日益发展CLR也有日新月异的变化。这些变化为开发带来更多有用的特性,在提高开发效率的同时也提高了程序的性能和稳定性。
如果大家觉得还有必要把这块更新的更好,还请多多反馈。
如果觉的对您有用还请点击 “推荐”下,我会持续更新更多新的内容。
CLR是什么
通用语言运行时(CommonLanguageRuntime,CLR)最早被称为下一代Windows服务运行时(NGWS Runtime).它是直接建立在操作系统上的一个虚拟环境,主要的任务是管理代码的运行。
CLR在.NetFramework中的位置
.NET平台结构图
CLR现在支持几十种现代的编程语言为它编写代码,然后以一种中间语言(Intermediate Language,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安全
- 简单的组件互操作性。
- 自描述组件:自描述组件是指将所有数据和代码都放在一个文件中的执行文件。自描述组件可以大大简化系统的开发和配置,并且改进系统的可靠性。
补充:大家可以看下我总结的一篇有关GC的一些东西(GC 快餐热卖)
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 版,你的用户可能需要先在(Windows7) Windows 8 或 Windows 8.1计算机上启用 .NET Framework 3.5,然后才能运行应用程序。
Update2:因@yubinfeng提醒,注释下:3.5的Framework都在Win7以后的版本中系统自带,只是默认不启用,需要时开【控制面板】->【程序和功能】->[打开或关闭Windows功能]->打开.NetFramework 3.5功能即可。(安装.netframework 不是本文的重点,如需更详细的介绍自行搜索下)
顺便看下 各个.Net Framework 新功能:
CLR最新发展
未来.NEtFrameWork 会有新的兄弟进来一起构建.Net 跨平台和云架构的梦想。
上图中Core CLR是Asp .Net vNext很重要的核心之一,虽然官方没说,但基本上就是一个精简版的CLR,拿掉了绘图等功能,让Server和Cloud程序更高效
至于MonoCLR,大家看名字就知道是为了更好的支持Mono这个开源的新秀的。
Update1:摘自MSDN的《使用 CoreCLR 编写 Silverlight》
自 2005 年 10 月发行 CLR 的 2.0 版本后就开始了 CoreCLR 的设计。它的两个主要设计目标是大小和兼容性:从编程人员的角度来看,针对 CLR 的编码应该始终相同,而从用户的角度来看,下载必须非常小。由于 Silverlight 旨在提供一组不同于桌面 CLR 的方案,因此,我们可以进行一些更改,以简化 CoreCLR 并允许我们缩减 Silverlight 的安装大小。但是,堆栈底部的一致性至关重要。行为差异(即使这些行为差异都正确)表明堆栈上部有错误。
为了确保兼容性,我们在堆栈底部的各个组件中使用相同的代码。执行引擎和虚拟机都是相同的。其中包括类型系统和元数据、垃圾回收器 (GC)、JIT 编译器、线程池以及运行时引擎的其他核心部件。
但是,为了适应 Web 应用程序方案,进行了一些更改。例如,富 Internet 应用程序通常简单且运行时间短,JIT 编译器主要侧重于减少启动时间,而非执行更复杂的优化操作。同样,服务器垃圾回收模式可以对使用相似分配模式的多个工作线程进行优化,而对 Web 托管应用程序则行不通。因此,Silverlight 只包含针对交互式应用程序进行优化的标准工作站 GC。但是,在 Silverlight 应用程序中使用 Microsoft 中间语言 (MSIL) 和元数据的方式与在针对桌面的托管应用程序中的使用方式完全相同,而且应用程序的行为在用户的桌面上和在浏览器上一致。
事实上,Silverlight 并不打算取代桌面 CLR,这就引发了核心引擎中最大的变化:CoreCLR 将与桌面 CLR 进程并行运行。
GitHub 上的开源库CoreCLR
参考
.NET Framework Versions and Dependencies(MSDN关于.NetFramework 各个版本和系统的依赖关系)
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 。
ntroduction to the Common Language Runtime (CLR)
釐清 CLR、.NET、C#、Visual Studio、ASP.NET 各版本之間的關係
后记
2015-7-12 :
更新了关于CoreCLR 部分介绍
添加了关于.NetFramework 3.5的在Win7,8,8.1无需安装,只需启用该功能即可
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. 托管与本地 ...
- python 学习爬虫教程~
思路:: (本文没有用xpath定位,xpath需要导入第三方库 from lxml import etree) 1.首先通过urllib类获取到网页的所有内容 2.通过partition获取其中 ...
- CLR via C# 摘要一:托管程序的执行模型
托管程序的执行模型大致如下: 编译源代码为程序集(dll或exe文件),程序集包括了记录相关信息的元数据和IL代码 执行程序集文件时,启动CLR,JIT负责把IL编译为本地代码并执行 IL是微软推出的 ...
- CLR和.Net对象生存周期
标签:GC .Net C# CLR 前言 1. 基础概念明晰 * 1.1 公告语言运行时 * 1.2 托管模块 * 1.3 对象和类型 * 1.4 垃圾回收器 2. 垃圾回收模型 * 2.1 为什么需 ...
- CLR via C# 读书笔记---常量、字段、方法和参数
常量 常量是值从不变化的符号.定义常量符号时,它的值必须能在编译时确定.确定后,编译器将唱两只保存在程序集元数据中.使用const关键字声明常量.由于常量值从不变化,所以常量总是被视为类型定义的一部分 ...
- .NET CLR 运行原理
原文: Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects 文章讨论了: SystemDoma ...
- CLR/.NET/C#/Visual Studio/ASP.NET各版本之间的关系(转)
由于这篇文章记录的是2015年7月,那时.net core还是叫做.net core 5 名词定义 下列这些名词,写.NET 的人一定都不陌生,但你是否有真正理解呢?如果看了我的摘要文字说明还无法理解 ...
- CLR via C#(15)--String,熟悉而又陌生
好久没写文章了,再拿起这本书,学习加分享,乐趣无穷啊.这两天看了写关于字符串的知识,从学写代码的时候开始,我们就基本天天跟String打交道,对它再熟悉不过了.但是仔细看看,还是有一种拨开云雾的感觉, ...
- CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段
编程语言的基元类型 某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们. System.Int32 a = new System.Int32(); // a = 0 a = 1 ...
随机推荐
- Android Studio配置 AndroidAnnotations——Hi_博客 Android App 开发笔记
以前用Eclicps 用习惯了现在 想学学 用Android Studio 两天的钻研终于 在我电脑上装了一个Android Studio 并完成了AndroidAnnotations 的配置. An ...
- 【造轮子】打造一个简单的万能Excel读写工具
大家工作或者平时是不是经常遇到要读写一些简单格式的Excel? shit!~很蛋疼,因为之前吹牛,就搞了个这东西,还算是挺实用,和大家分享下. 厌烦了每次搞简单类型的Excel读写?不怕~来,喜欢流式 ...
- TODO:Laravel 使用blade标签布局页面
TODO:Laravel 使用blade标签布局页面 本文主要介绍Laravel的标签使用,统一布局页面.主要用到到标签有@yield,@ stack,@extends,@section,@stop, ...
- 7.让网站支持http和https的访问方式
平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html#iis 怎么让网站在本地支持SSL?http://www.c ...
- Matlab 高脚杯模型切片
前言:此文为去年我替人做的一个课题,觉得比较简洁,图形也比较美观,因此放在博文里 数据源我放到了百度云盘高脚杯数据源 有兴趣的可以下载数据,跑程序试一下.也可以单独看看代码,看下实现过程. 主函数 % ...
- runtime梳理。
一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C语言,函数的调用在编译的时候会决定调用哪个函数. 对于OC的函数,属于 ...
- 记录我这一年的技术之路(nodejs纯干货)
2015年12月28日23:19:54 更新koa应用.学习型网站和开发者工具等 coding伊始 开始认认真真的学习技术还是2015.10.21日开始的,记得很清楚,那天,是我在龙湖正式学习的第一天 ...
- Go web开发初探
2017年的第一篇博客,也是第一次写博客,写的不好,请各位见谅. 本人之前一直学习java.java web,最近开始学习Go语言,所以也想了解一下Go语言中web的开发方式以及运行机制. 在< ...
- 谈谈JS的观察者模式(自定义事件)
呼呼...前不久参加了一个笔试,里面有一到JS编程题,当时看着题目就蒙圈...后来研究了一下,原来就是所谓的观察者模式.就记下来...^_^ 题目 [附加题] 请实现下面的自定义事件 Event 对象 ...
- linux下安装Redis以及phpredis模块
一:redis的安装 1. 首先上官网下载Redis 压缩包,地址:http://redis.io/download 下载 2. 通过远程管理工具,将压缩包拷贝到Linux服务器中,执行解压操作 3. ...