.net、mono和C#


.net

wiki:en  chs

.net版本 公共语言运行时(CLR) 发布时间 随同分发的Visual Studio 预装于windows系统 支持的windows系统
1.0 1.0 2002.2.23 Visual Studio .NET WinXP WinXP
1.1 1.1 2003年4月24日 Visual Studio .NET 2003   WinXP、Vista
2.0 2.0 2005年11月7日 Visual Studio 2005  

WinXP、Vista、Win7、

Win8、Win8.1、Win10

3.0 2.0 2006年11月6日 Microsoft Blend for Visual Studio Vista
3.5 2.0 2007年11月19日 Visual Studio 2008 Win7
4.0 4 2010年4月12日 Visual Studio 2010  

WinXP SP3、Vista SP1、Win7、

Win8、Win8.1、Win10

4.5 4 2012年8月15日 Visual Studio 2012 Win8

Vista SP2、Win7 SP1、

Win8、Win8.1、Win10

4.5.1 4 2013年10月17日 Visual Studio 2013 Win8.1
4.5.2 4 2014年5月5日    
4.6 4 2015年7月20日 Visual Studio 2015 Win10
4.6.1 4 2015年11月30日 Visual Studio 2015 Update 1 Win10 v1511
4.6.2 4 2016年8月2日   Win10 v1607
4.7 4 2017年4月5日 Visual Studio 2017 Win10 v1703

注1:同一版本的CLR(Common Language Runtime)的.net是向上兼容的

注2:支持WinForm的.net framework最低版本为2.0,支持WPF的.net framework最低版本为3.0

注3:.net corechs是微软重新开发的开源跨平台.net实现,是未来的所有.net平台的基础。

          在.net core推出之后,.net framework与mono将基于.net core重新构建。.net framework将成为其在windows上的一个发行版,mono将成为.net core的一个跨平台发行版。

          .net core提供corefx类库C#及Visual Basic编译器,并实现了2种运行时:

           ① NativeRuntime -- 将.net代码直接转换为本地机器码

           ② CoreCLR -- 开源的JIT(Just-in-Time compilation,即时编译)运行时,来动态地将符合CLS(Common Language Specification,公共语言规范)

               的CIL(Common Intermediate Language,通用中间语言)或叫MSIL实时转换为本地机器码

               CIL可以在任何支持CLI(Common Language Infrastructure,通用语言基础结构)的环境中运行

              并提供了BCL(Base Classlibrary,基础类库)包含如FileSystem、Console、XML操作等

         

注4:.net compact framework(wiki:en  chs)为精简版的.net framework,主要用于移动或嵌入式windows平台开发

mono

wiki:en   chs

github:prj  docs

mono是.net framework的一个开源的、跨平台的实现。由mono运行时、mono编译器、 .NET Frame Class Libray及Mono Class Libray组成。

(1)mono运行时(CLR )实现了ECMA 公共语言基础结构(CLI)标准,提供了即时(JIT)编译器,静态编译器(AOT,Ahead Of Time,wiki),库加载器,垃圾回收机器,线程操作,互操作性

(2)许多语言(如:C#、VB.NET、Java、JavaScript、Python、Lua等)实现了生成为CIL的编译器,使得这些语言可以在mono上运行,其C#编译器提供C#所有版本的完整功能

(3).NET Frame Class Libray是Mono平台提供了一组全面的兼容微软的.Net framework类库

(4)Mono Class Libray是Mono自己的类库,其提供的功能是有用的,特别是在构建Linux应用程序。如:Gtk +、Zip、LDAP、OpenGL、Cairo、POSIX等相关的类。

注1:Mono会将程序一部分代码通过AOT(AOT实际也是调用JIT来提前静态编译得到本地机器码),以降低在程序运行时JIT动态编译在效率上的问题。

注2:在iOS平台是禁止JIT的,所以mono只能以Full AOT(完全静态编译)模式运行的(即:将程序集所有CIL代码进行AOT编译生成本地机器码)

         ExecutionEngineException: Attempting to JIT compile method '...' while running with --aot-only.

         目前由于技术或实现上的原因在使用Full AOT写代码时有一些限制

        ① 不支持泛型虚方法,因为对于泛型代码,Mono通过静态分析以确定要实例化的类型并生成代码,但静态分析无法确定运行时实际调用的方法(C++也因此不支持虚模版函数)

        ② 不支持对泛型类的P/Invoke

        ③ 不能使用反射中的Property.SetInfo给非空类型赋值

        ④ 值类型作为Dictionary的Key时会有问题,实际上实现了IEquatable的类型都会有此问题,因为Dictionary的默认构造函数会使用EqualityComparer.Default作为比较器,

             而对于实现了IEquatable的类型,EqualityComparer.Default要通过反射来实例化一个实现了IEqualityComparer的类(可以参考EqualityComparer的实现)。

             解决方案是自己实现一个IEqualityComparer,然后使用Dictionary(IEqualityComparer)构造器创建Dictionary实例。

        ⑤ 由于不允许动态生成代码,不允许使用System.Reflection.Emit,不允许动态创建类型。注:不要混淆了Reflection.Emit和反射,所有反射的API均可用

        ⑥ 由于不允许使用System.Reflection.Emit,无法使用DLR(Dynamic Language Runtime,动态语言运行时)及基于DLR的任何语言。

unity使用的mono在github专门拉了份代码,下面是之间版本的说明:

Unity版本 mono运行时版本 clr版本 对应.net版本 对应C#版本 说明
3.x、4.x、5.x 2.0 2.0 3.5 4.0 完全支持C#3.0,但也支持某些C#4.0特性(注:clr2.0支持下的特性)

5.3.5p8的测试版

5.5及以上版本

2.0 2.0 3.5 4.0

① 升级为mono4.4版本中的C#编译器,就编译器而言能支持C#6.0

② 运行时还是2.0,受其限制,实际对C#的支持情况与3.x、4.x、5.x版本一致

③ 5.3.5p8正式版本并没有升级C#编译器,而是单独给出一个5.3.5p8的测试版,在这个特殊版本中含有升级的C#编译器

④ 5.5及以上版本开始使用升级C#编译器

2017.1

2017.2

2.0

5.0.1

2.0

4.0

3.5

4.6

4.0

6.0

① 缺省使用先前版本的运行时与C#编译器版本

② 菜单:Edit --> Project Settings --> Player  Other Settings设置块Configuration节中,

修改"Scripting Runtime Version" 中的 Stable(.NET 3.5 Equivavalent) 为 Experimental(.NET 4.6 Equivavalent) 

C#

wiki:en  chs

版本 语言规格 .NET版本 Visual Studio版本
ECMA ISO/IEC Microsoft
C#1.0 2002年12月 2003年4月 2002年1月 1.0 2002
C#1.1、1.2 2003年10月 1.1 2003
C#2.0  2006年6月  2006年9月 2005年9月 2.0 2005
C#3.0     2007年8月

2.0(Except LINQ/Query Extensions)

3.0(Except LINQ/Query Extensions)

3.5

2008、2010
C#4.0     2010年4月 4 2010
C#5.0     2012年10月 4.5 2012
4.5.1 2013
C#6.0     2015年7月 4.6 2015
C#7.0       4.6.2 2017

扩展阅读:

Unity C# 5.0 and 6.0 Integration