跨平台的.NET运行环境-Mono
2014-08-17 07:08:49 阿炯

Mono 是一个由Novell公司主持的项目。其目标是创建一系列符合ECMA 标准(Ecma-334 和Ecma-335)的.NET 工具,包括C#编译器和共通语言执行平台。与微软的.NET Framework 不同,Mono 项目不仅可以运行于Windows 系统上,还可以运行于Linux,FreeBSD,Unix,Mac OS X 和Solaris。采用GPL/LGPL/MIT授权协议。


Cross platform, open source .NET framework

Mono is an open source implementation of Microsoft's .NET Framework based on the ECMA standards for C# and the Common Language Runtime. A growing family of solutions and an active and enthusiastic contributing community is helping position Mono to become the leading choice for development of cross platform applications.

Mono 的开发工具 MonoDevelop

微软开发了一个称为共享源码公共语言基础(Shared Source Common Language Infrastructure,Shared Source CLI)的可用于 FreeBSD,Windows 和 Mac OS X 的 .NET 实现版本。微软的共享源码协议并不是开源软件协议,且可能对于社区来说也是不足够的(它明文禁止了对软件的商业用途)。我们还可以见到另外一个 .NET 实现版本,Portable.NET 项目,该项目与 Mono 项目有着很多相同的目标。

Mono 虚拟机包含一个实时编译引擎,该引擎可用于如下处理器:x86、SPARC、PowerPC、ARM、S390(32位模式和64位模式)、x86-64、IA64 和64位模式的 SPARC。该虚拟机可以将代码实时编译或者预先编译到原生代码,对于那些没有列出来的系统,则使用的是代码解释器。

下图是MONO的体系结构图


Mono 改用 MIT 开源许可证

在2016年4月中旬 Mono 项目的官方博客上,Miguel de Icaza 宣布 Mono 运行时项目的许可证由原来的双协议 (LGPLv2 和专属许可) 改为 MIT 许可证。而 Mono 编译器及其类库已经是使用 MIT 许可证。此举移除了对 C# 和 .NET 在应用开发上的障碍,使得可以方便用于各种开发场景,包括嵌入式应用,以及在游戏和其他应用中嵌入 Mono 作为脚本引擎。De Icaza 同时提到 Xamarin(已被微软收购)在过去几年已经开发了很多专属私有的模块,这些模块也已经使用 MIT 许可证开源。


说说其原始作者Miguel de Icaza(米格尔·德·伊卡萨)

先从早些时间说起吧,20世纪90年代是微软一手遮天的高光时刻,其不仅统治了操作系统,还把一众应用软件厂商打得无招架之力,成为行业公敌。这时候出现了三个新事物:Linux、Java、Netscape,它们将成为微软帝国的掘墓人。

Java刚出现的时候,高呼“一次编写,到处运行”的口号,好像操作系统变得不那么重要了;但Java写的桌面应用实在差劲,界面丑陋,性能低下,被人嘲笑。Sun公司很快意识到不能在桌面端和微软争了,得往服务器端走!服务器端的程序没有界面,内存和CPU管够,缺的就是Java这种非常适合写商业业务逻辑的语言!

Sun提出了J2EE(Servlet、EJB、JPA、JMS....)规范,联合了一众大佬,形成了反微软联盟,在互联网时代牢牢地卡住了位置。Bill Gates心里约么在想:用了二十年才好不容易把“桌面”收拾干净,现在又来了一个互联网!他先是搞了一个小阴谋,挖来了编程语言和编译器的大师级人物Anders,开发了VJ++,不但可以绕过Java API直接访问操作系统的功能,还可以把Java代码编译成Windows的exe来执行!


Sun一看VJ++就炸毛了:你这是破坏Java一次编写,到处运行的特点,立刻就把微软告了。微软的小动作没搞成,只能下定决心,重起炉灶,和Java对抗,这就是.Net战略。


.Net 刚开始就是和Java打擂台的,Java有字节码,.Net就有中间语言(Common Intermediate Language,简称IL);


Java有JRE,.Net就有CLR(Common Language Runtime)。

.Net的一大亮点是支持多语言开发,用C#、F#、VB .NET、C++都可以,反正最终都要编译成中间语言IL。

微软为了吸引更多的同盟军,这一次难得地再和自己的铁哥们Intel搞在一起,制定了公共语言基础结构(CLI)规范,并且提交给ISO和ECMA做了标准化。

用面向对象来做个类比,CLI相当于接口,微软的.Net Framework是CLI的一个商业实现。任何人都可以实现CLI,理论上都是和.Net Framework都是平起平坐的。但是实现CLI,工作量过于庞大,CLI又是微软主导的,真的有人会这么干吗?


Miguel de Icaza(米格尔·德·伊卡萨)是个墨西哥裔程序员,大学专业本来是数学,但是他不务正业,迷上了Linux和编程,给Linux内核做了很多贡献。


没时间学习,他干脆辍学了。没有学位,拿不到美国的H-1B签证,这让他丧失了进入微软的机会。不过幸亏他没进微软,否则以微软当时仇视开源软件的态度,他根本不可能搞出来GNOME。没错,GNOME桌面项目就是米格尔牵头发起的,很就和KDE一样成为Linux桌面的双雄。

在微软面试时,米格尔遇到了在微软实习的Nat Friedman,并成为好友。1999年,两人一起成立了一个叫做Ximian的公司,专门支持GNOME的发展。这是刚刚流行起来的一种商业模式,软件是开源免费的,但是技术支持服务是可以收费的。

公司获得了获得了几百万美元的融资,但让人苦笑不得的是,虽然米格尔已经在IT界有了非常高的名气,但依然无法获得美国的H-1B签证。最后米格尔通过O1签证来到了美利坚,O1签证本来是颁发给顶级音乐家,运动员,以及诺贝尔获奖者的。当时O1签证很麻烦,米格尔每隔6个月就需要会墨西哥的美国领事馆续签一次。

微软发布.Net战略后,米格尔意识到.Net这种支持多语言的策略对GNOME有很大的帮助,如果在Linux上实现.Net,那程序员就可以用自己喜欢的编程语言来开发Linux桌面应用程序了。

于是米格尔决定推出开源项目Mono,在Linux上实现.Net,把.Net的另外一条腿接上。


这是米格尔第二次和微软发生联系,这个决定引发了很多开源界大佬的批评,GNU的创始人,自由软件的斗士Richard Stallman狠批他是为“自由软件的叛徒”,竟然把邪恶的微软持有专利的东西在Linux上实现!

Mono虽然比不上微软的亲儿子.Net Framework,但的确解决了一个大问题,获得了很多人的喜爱。比如著名的游戏引擎Unity最早就选择了Mono作为底层的.Net运行时,可以跨平台地执行C#代码。


随后,一系列大鱼吃小鱼事件开始上演。2003年,米格尔的Ximian公司被Novell收购,米格尔出任副总裁。2011年,Novell又被Attachmate收购,Attachmate解雇了所有在美国从事Mono工作的员工,包括米格尔。Mono前途未卜,米格尔和Nat Friedman又成立了新公司Xamarin公司,继续开发Mono。


此时移动互联网已经兴起,Xamarin公司趁势推出了Xamarin.iOS 和 Xamarin.Android,让.Net应用程序可以运行在手机之上。

不得不说,米格尔眼光独到,这是至关重要的一个决定。

因为仅仅三年后,微软就推出了开源、跨平台的.Net Core,一下子让Mono处于很尴尬的地位,毕竟再怎么着,也很难和官方的产品竞争啊。2016年,微软以4亿美元收购了Xamarin,让它成为微软.Net框架的一部分。这一次,米格尔正式加入了微软。


从.Net 5开始,.NET Framework、.NET Core、Mono又被整合到了一起,可以支持桌面、Web、云、移动设备、游戏、IoT、AI等各种开发。


2024年8月27日,微软将 Mono 上游项目的所有权转让给Windows兼容层Wine的开发团队 WineHQ 。

发起了GNOME、Mono两个著名项目,两次创业,全部成功,米格尔不愧为人生赢家。作为开源界的知名人物,他和很多热爱Linux的大牛不一样,他是个实用主义者。

为了让GNOME支持多语言的应用,他把微软拥有专利的.Net引入了Linux世界和手机的世界,被批为“叛徒”。他公开支持微软的开放技术,在ODF(Open Document Format) 和OOXML(Office Open XML)的大战中,他旗帜鲜明地支持微软的OOXML,完全不顾开源社区的广泛批评。虽然他是Linux桌面GNOME的发起者,但是他毫不掩饰对macOS的喜爱,他批评 Linux 桌面以开发者为中心的文化、缺乏向后兼容性以及各种 Linux 发行版之间的分裂,这都导致“Linux桌面被毁掉”。


最新版本:4.0
这是首个包含来自微软开源 .Net 代码的版本,也是第一个缺省启用 Csharp 6.0 的 Mono 版本。

官方主页:http://www.mono-project.com/