.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 ...
随机推荐
- sql server I/O硬盘交互
一. 概述 sql server作为关系型数据库,需要进行数据存储, 那在运行中就会不断的与硬盘进行读写交互.如果读写不能正确快速的完成,就会出现性能问题以及数据库损坏问题.下面讲讲引起I/O的产生, ...
- python args kwargs 传递参数的区别
先来看个例子: def foo(*args, **kwargs): print 'args = ', args print 'kwargs = ', kwargs print '----------- ...
- linux 命令 — find
find 基本形式 find base_path base_path可以是任何目录,find会从该目录开始往下寻找 find . -print 列出当前目录下所有的文件和目录,以'\n'作为分隔符 f ...
- How Tomcat works — 一、怎样阅读源码
在编程的道路上,通过阅读优秀的代码来提升自己是很好的办法.一直想阅读一些开源项目,可是没有合适的机会开始.最近做项目的时候用到了shiro,需要做集群的session共享,经过查找发现tomcat的s ...
- Java 类的加载机制
1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构 ...
- [机器学习]集成学习--bagging、boosting、stacking
集成学习简介 集成学习(ensemble learning)通过构建并结合多个学习器来完成学习任务. 如何产生"好而不同"的个体学习器,是集成学习研究的核心. 集成学习的思路是通过 ...
- python字典类型
字典类型简介 字典(dict)是存储key/value数据的容器,也就是所谓的map.hash.关联数组.无论是什么称呼,都是键值对存储的方式. 在python中,dict类型使用大括号包围: D = ...
- python装饰器1:函数装饰器详解
装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函 ...
- Java编程思想——异常
1.异常对象的方法printStackTrace 作用是打印Throwable和Throwable的调用栈轨迹. 2.finally 不管抛没抛出异常,都会执行finally中的代码.前提是出异常的代 ...
- Postman Post请求上传文件
Postman Post请求上传文件一.选择post请求方式,输入请求地址 二.填写Headers Key:Content-Type :Value:multipart/form-data 如下图 三. ...