.net、mono和C#

.net  framework

wiki:en  chs

版本 公共语言运行时(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 framework是向上兼容的

注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),库加载器,垃圾回收机器,线程操作,互操作性

(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.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

时间: 2024-08-09 06:33:17

.net、mono和C#的相关文章

MONO加载DLL调试命令

http://www.mono-project.com/docs/advanced/pinvoke/dllnotfoundexception/ http://www.mono-project.com/docs/advanced/pinvoke/dllmap/ $ MONO_LOG_LEVEL=debug mono GdiExample.exe

centos 7 安装mono 和 monodevelop

本次所有操作在root模式下 1.执行  rpm --import "http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF" 2.执行  yum-config-manager --add-repo http://download.mono-project.com/repo/centos/ 1-2 添加mono安装使用的资源环境 3.执行 yu

mono 3.10 Socket引发未知异常的悲剧事情...

最近在做mono 3.10针对socket性能方面的测试,在想对压力比较高的情况下发现了mono的一个bug会导致程序引发未知异常从而导致程序结束的严重问题. 错误信息 Unhandled Exception: System.InvalidOperationException: EndSend can only be called once per asynchronous operation at System.Net.Sockets.Socket.EndSend (IAsyncResult

Linux + Mono 目前已经支持Entity Framework 6.1

在上个随笔 CentOS上 Mono3.2.8运行ASP.NET MVC4经验中,步骤2中要求卸载EF 5.0,这样才能在Linux + Mono的环境中运行ASP.NET MVC4的Web应用.今天,没有卸载EF 5.0的情况下,使用NuGet新安装了EF 6.1.0,如下图(使用VS012英文版), 图1: 新安装了Entity Framework 6.1.0,同时EF5.0没有卸载,可在图片中看到两个EF共存 图1中的这个网站是一个接近完成的完整网站,在其它各项配置都与 CentOS上 M

从游戏脚本语言说起,剖析Mono所搭建的脚本基础

0x00 前言 在日常的工作中,我偶尔能遇到这样的问题:“为何游戏脚本在现在的游戏开发中变得不可或缺?”.那么这周我就写篇文章从游戏脚本聊起,分析一下游戏脚本因何出现,而mono又能提供怎样的脚本基础.最后会通过模拟Unity3D游戏引擎中的脚本功能,将Mono运行时嵌入到一个非托管(C/C++)程序中,实现脚本语言和“引擎”之间的分离. 回到目录 0x01 Why?从为何需要游戏脚本开始 首先聊聊为何现在的游戏开发需要使用游戏脚本这个话题. 为何需要有脚本系统呢?脚本系统又是因何而出现的呢?其

Unity Mono运行机制分析及内存优化

一.Mono原理 此处简单介绍下Mono这个奇葩,主要通过Mono可以轻松实现跨平台,目前使用Unity开发手游Android平台大多使用Mono实现,但是诛仙手游使用il2cpp技术.具体il2cpp知识大家可以度娘. 二.内存分配机制 上图为内存分配策略,但是在此结合实践经验有bug存在,当分配大块内存特别明显,来回分配与切换应用会崩溃,主要是GC不够及时即使是每次分配完手动GC也不会立即释放. 三.内存泄漏原因 Mono是如何判断已用内存中哪些是不再需要使用的呢?是通过引用关系的方式来进行

使用Mono Cecil 动态获取运行时数据 (Atribute形式 进行注入) -摘自网络

目录 一:普通写法 二:注入定义 三:Weave函数 四:参数构造 五:业务编写 六:注入调用 一:普通写法 1 2 3 4 public static string GetPoint(int x, int y)  {     var value=x; } 哇 好简单啊.其实动态获取和我们普通这样写代码是一样的,我们把要注入的代码,生成一个接收的变量就可以了. 就像上面value 一样接收,然后传递给我们自己函数就可以了. 二 :注入定义 public class WeaveService :

Mono及MonoDevelop安装

一.简介 Mono是一个由Novell公司(由Ximian发起并由Miguel de lcaza领导的)主持的项目,是一个致力于开创.NET在Linux上使用的开源工程.它包含了一个C#语言的编译器,一个CLR的运行时,和一组类库,并实现了 ADO NET和ASP NET.能够使得开发人员在Linux用C#开发程序.该项目的目标是创建一系列符合标准ECMA (Ecma-334和Ecma-335)的.Net 工程,包括C#编译器和共同语言(CL 即 Common Language)执行平台(Pla

Raspberry Pi 中安装Mono

摘自:http://www.phodal.com/blog/user-csharp-develop-raspberry-pi-application/ Raspberry Pi C# Mono Linux Mono是一个由Xamarin公司(先前是Novell,最早为Ximian)所主持的自由开放源代码项目.该项目的目标是创建一系列符合ECMA标准(Ecma-334和Ecma-335)的.NET工具,包括C#编译器和通用语言架构. 其他 Mono虚拟机包含一个实时编译引擎,该引擎可用于如下处理器

linux下mono,powershell安装教程

1简介 简单来说pash就是bash+powershell 2官网 https://github.com/Pash-Project/Pash 3下载fedora20---lxde桌面---32位版. http://download.fedoraproject.org/pub/fedora/linux/releases/20/Live/i386/Fedora-Live-LXDE-i686-20-1.iso 4用vmware虚拟机安装linux,设置用户root,密码=123456,用户user00