.net、mono和C#
.net
.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 core(chs)是微软重新开发的开源跨平台.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
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<T>的类型都会有此问题,因为Dictionary的默认构造函数会使用EqualityComparer<TKey>.Default作为比较器,
而对于实现了IEquatable<T>的类型,EqualityComparer<TKey>.Default要通过反射来实例化一个实现了IEqualityComparer<TKey>的类(可以参考EqualityComparer<T>的实现)。
解决方案是自己实现一个IEqualityComparer<TKey>,然后使用Dictionary<TKey, TValue>(IEqualityComparer<TKey>)构造器创建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.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#
版本 | 语言规格 | .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
.net、mono和C#的更多相关文章
- tLinux 2.2下安装Mono 4.8
Tlinux2.2发行版基于CentOS 7.2.1511研发而成,内核版本与Tlinux2.0发行版保持完全一致,更加稳定,并保持对Tlinux2.0的完全兼容.Mono 4版本要求CentOS 7 ...
- 使用Visual Studio 2015 开发ASP.NET MVC 5 项目部署到Mono/Jexus
最新的Mono 4.4已经支持运行asp.net mvc5项目,有的同学听了这句话就兴高采烈的拿起Visual Studio 2015创建了一个mvc 5的项目,然后部署到Mono上,浏览下发现一堆错 ...
- Mono为何能跨平台?聊聊CIL(MSIL)
前言: 其实小匹夫在U3D的开发中一直对U3D的跨平台能力很好奇.到底是什么原理使得U3D可以跨平台呢?后来发现了Mono的作用,并进一步了解到了CIL的存在.所以,作为一个对Unity3D跨平台能力 ...
- 在.NET Core之前,实现.Net跨平台之Mono+CentOS+Jexus初体验
准备工作 本篇文章采用Mono+CentOS+Jexus的方式实现部署.Net的Web应用程序(实战,上线项目). 不懂Mono的请移步张善友大神的:国内 Mono 相关文章汇总 不懂Jexus为何物 ...
- 【月入41万】Mono For Android中使用百度地图SDK
借助于Mono For Android技术,.Net开发者也可以使用自己熟悉的C#语言以及.Net来开发Android应用.由于Mono For Android把Android SDK中绝大部分类库都 ...
- 运用Mono.Cecil 反射读取.NET程序集元数据
CLR自带的反射机智和API可以很轻松的读取.NET程序集信息,但是不能对程序集进行修改.CLR提供的是只读的API,但是开源项目Mono.Cecil不仅仅可以读取.NET程序集的元数据,还可以进行修 ...
- Mono on CentOS 6.3 安装笔记
在网上找到篇关于yum的文章,写的很详细特此推荐下,在阅读本文之前建议先看看它: <CentOS yum源的配置与使用> 如果用的是移动光驱,建议不要开启本地的yum 的本地reposit ...
- MemoryMappedFile 在 Mono in Linux 的开发笔记
前言 MemoryMappedFile(简称MMF)类是.NET中对内存映射文件进行操作的类,内存映射文件是非常高效的本地IO方案,由操作系统提供内存与IO文件之间的映射转换,对内存映射文件的更改由操 ...
- 在Linux(Ubuntu/openSUSE/CentOS)下配置ASP.NET(Apache + Mono)
[题外话] 闲的无聊竟然想尝试测试自己做的项目在不同操作系统上的性能表现,所以决定试试在Linux上部署Apache和Mono的环境.由于平时很少接触Linux,所以从网上找了几篇文章(附在相关链接中 ...
- Ubuntu下利用Mono,Jexus搭建Asp.Net(MVC) Web服务器
最近在Ubuntu上搭建了Asp.Net的Web服务器,其中遇到很多问题,整理一下思路,以备后用. 搭建环境以及配套软件 Ubuntu: 11.10 Mono:3.0.6 下载地址(http://do ...
随机推荐
- TypeError: Cannot red property 'style' of null 错误解决
错误信息如下: JSP代码如下: <c:if test ="${not empty excelErrors}"> <div id="excelError ...
- java jar 后台运行
nohup java -jar $APP_NAME.jar >/dev/null &
- springboot~让我习惯了TDD的开发模式
TDD是什么 TDD就是测试驱动开发,以测试用例为主导,去开发项目,业务代码该怎么写还是怎么写,在实现UI之前,可以先实现Test用例,通过test来实现对业务场景的模拟,最终让你的代码更稳定. 大叔 ...
- java数据类型大转换
1.字符串类型向整形转换 int age = Integer.parseInt(strAge); 2 int -> String int i=12;String s="";第 ...
- Docker 构建映像
.用docker commit构建映像 .docker run -i -t centos /bin/bash //启动一个容器,启动后默认进入该窗口的bash进程 .yum install -y ep ...
- spring-boot(五) RabbitMQ详解 定时任务
学习文章来自:springboot(八):RabbitMQ详解 springboot(九):定时任务 RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分 ...
- DynamicProxy系列目录
C# 1.基于Emit实现动态代理 2.Microsoft.CodeAnalysis动态生成代理类 3.castle dynamicproxy + AutoFac 4.DispatchProxy .R ...
- CC2530微处理器接口开发技术——信号灯的设计与实现
本问主要介绍了CC2530处理器的通用输入/输出接口(GPIO),以及GPIO的位操作,理解GPIO的基本原理和功能,最后使用C语言驱动CC2530的GPIO实现对信号灯的控制. CC2530的GPI ...
- ARM 汇编指令 ADR 与 LDR 使用
简介 这两个都是伪指令:ADR 是小范围的地址读取伪指令,LDR 是大范围的读取地址伪指令.可实际使用的区别是: ADR 是将基于 PC 相对偏移的地址值或基于寄存器相对地址值读取的伪指令,而 LDR ...
- Linux命令-设置免密码登录
设置免密码登陆:[root@Redis01 test]# cd /install/[root@Redis01 install]# rm -rf test/[root@Redis01 install]# ...