Mono

Mono是一个由Xamarin公司（先前是Novell，最早為Ximian）所主持的自由開放源碼專案。該專案的目標是创建一系列符合ECMA标准（Ecma-334Ecma-334和Ecma-335Ecma-335）的.NET工具，包括C#编译器和通用语言架构。与微软的.NET Framework（共通語言執行平臺）不同，Mono项目不仅可以运行于Windows系统上，还可以运行于Linux、FreeBSD、Unix、OS X和Solaris，甚至一些遊戲平台，例如：Playstation 3、Wii或XBox 360。Mono的標誌是一個猴子格式的臉。

Mono现由Novell持有双重许可，这和Qt和Mozilla Application Suite的情况相似。Mono的C#编译器及其相关工具发布于GNU通用公共许可证（GPL）之下，其运行时库发布于GNU宽通用公共许可证（LGPL）之下，其类库发布于MIT許可證之下。这些均是开源协议因此Mono是一个开源软件。

微软开发了一个称为通用语言架构（Shared Source Common Language Infrastructure，Shared Source CLI；即今ECMA—通用语言架构）的可用于FreeBSD，Windows和Mac OS X的.NET实现版本。微软的共享源代码协议并不是开源软件协议，且可能对于社区来说也是不足够的（它明文禁止了对软件的商业用途）。另外，GNU也有一个.NET实现版本项目，该项目与Mono项目有着很多相同的目标。

Mono虚拟机包含一个即時編譯引擎，该引擎可用于如下处理器：x86、SPARC、PowerPC、ARM、S390（32位模式和64位模式）、x86-64、IA-64和64位模式的SPARC。该虚拟机可以将代码编译为本机代码。

 历史 
當Microsoft在2000年6月第一次公佈.NET Framework時，它被描述為一個以網際網路標準為基底的新的平台。並且在12月發表了基本的共通語言架構開放標準的形式（ECMA-335），提供了無相依性實作的可能。Ximian的
米格爾·德伊卡薩在.NET的文档于2000年10月发布时就马上对.NET产生了兴趣。在查看字节码解释器后，他发现对于元数据（metadata）没有相应的说明文档。2001年2月，德伊卡薩在.NET邮件列表中索要到了那段缺失了的关于元数据文件格式的信息，并开始了采用C#编写一个C#编译器的工作，作为对C#的实践。2001年4月ECMA公布了那段缺失的文件格式，而在GUADEC（2001年4月6日－4月8日）德伊卡薩展示了他的编译器的一些特性（那个时候他的编译可以解释自身）。

Ximian内部对如何创建能有效提升生产效率的工具进行了大量的讨论，他们的目标是通过这些创建出来的工具让使用者可以在更短时间内创建出更多的应用程序从而缩短开发周期和降低开发成本。经过可行性研究后，他们清楚地见到创建这样的一项技术是可行的，于是Ximian从其它的项目抽调人员并创建了Mono的开发小组。由于缺少人力来创建整个.NET替代产品，他们在2001年7月19日的歐萊禮大会创建了Mono的开源项目。

差不多三年后，Mono于2004年7月30日发布了1.0版本。Mono逐步從一開始的重點為Linux桌面應用程式開發者平台，到支援寛廣範圍的架構和作業系統，包含了嵌入式系統。

在2011年4月，Attachmate收購Novell後，針對Novell發布了上百位人力的解僱。在3月16號德伊卡薩在他的blog發佈在被Novell解僱後，他找到一家公司將透過Xamarin繼續支援Mono。原本的Mono團隊也被移到新的公司。Xamarin計畫維持在Mono的工作。由於在這時間點Novell仍然擁有MonoTouch和專為Android的Mono，所以計畫針對iOS和Android上重寫商業化的.NETstacks。

在這發表之後，這個專案的未來被質疑。因為，專屬 Android的MonoTouch and Mono變成跟現存Attachmate所屬的商業化商品有直接競爭，也考量了Xamarin團隊為了相同的作品而不使用之前在Novell開發的技術，證實是有困難的。無論如何，在2011年七月Novell、Attachmate的子公司及Xamarin發表了對Xamarin for Mono, MonoTouch and Mono for Android的永久性許可證，正式地帶起這個案子的管理方式。
+發行歷史（Release History） 發行日（Date） 版本（Version） 備註（Notes） 2004-06-30  1.0 C# 1.0 support 2004-09-21  1.1 2006-11-09  1.2 C# 2.0 support 2008-10-06  2.0 Mono's APIs are now in par with .NET 2.0. Introduces the C# 3.0 and Visual Basic 8 compilers. New Mono-specific APIs: MonoCecil, MonoCairo and MonoPosix. Gtk# 2.12 is released. The Gendarme verification tool and Mono Linker are introduced. 2009-01-13  2.2 Mono switches its JIT engine to a new internal representation that gives it a performance boost and introduces SIMD support in the MonoSimd MonoSimd namespace. Mono introduces Full Ahead of Time compilation that allows developers to create full static applications and debuts the C# Compiler as a Service and the C# Interactive Shell （C# REPL） 2009-03-30  2.4 This release mostly polishes all the features that shipped in 2.2 and became the foundation for the Long-Term support of Mono in SUSE Linux. 2009-12-15  2.6 The Mono runtime is now able to use LLVM as a code generation backend and this release introduces Mono co-routines, the Mono Soft Debugger and the CoreCLR security system required for Moonlight and other Web-based plugins. On the class library System.IO.Packaging, WCF client, WCF server, LINQ to SQL debut. The Interactive shell supports auto-completion and the LINQ to SQL supports multiple database backends. The xbuild build system is introduced. 2010-09-22  2.8 Defaults to .NET 4.0 profile, C# 4.0 support, new generational garbage collector, includes , WCF Routing, CodeContracts, ASP.NET 4.0, drops the 1.0 profile support; the LLVM engine tuned to support 99.9% of all generated code, runtime selectable llvm and gc; incorporates Dynamic Language Runtime, , ASP.NET MVC2, OData Client open source code from Microsoft;. Will become release 3.0 2011-02-15  2.10 2012-10-18  3.0 C# 5.0 support, async support, Async Base Class Library Upgrade and MVC4 - Partial, no async features support. 2013-07-24  3.2 2014-05-31  3.4 2014-05-31  3.6 2014-09-04  3.8 2014-10-04  3.10

  目前的狀況與藍圖　

截止2024年12月，Mono更新到了6.12.0.206版本，但项目已经由被微软收购的Xamarin移交给WineHQ，官方建议将现有Mono应用程序迁移到同样开源的.Net平台上。

 Mono組成元件 
Mono組成元件包含了以下三類：
 核心元件
 Mono/Linux/GNOME開發堆疊
 微軟相容堆疊

核心元件包含了C# 編譯器，Common Language Infrastructure虛擬機器，以及核心類別程式庫。這些元件都是基於Ecma-334 and Ecma-335標準,而使得Mono能夠提供與標準相容、免費、並且是開放原始碼的CLI 虛擬機器。微軟曾經聲明這些標準都是基於Community Promise license的社群保護承諾之下。

Mono/Linux/GNOME開發堆疊則是提供了工具以用於開發應用軟體。這些工具使用了既有的GNOME以及自由並且開放原始碼程式庫，它們包含了針對圖形使用者介面（GUI）開發的Gtk#、可套用Gecko rendering engine的Mozilla程式庫、Unix整合程式庫（Mono.Posix）、安全性推疊、以及XML schema語言RelaxNG。Gtk# 讓Mono應用程式融入Gnome桌面環境而成為原生程式。資料庫程式庫則提供了與物件關連式資料庫連結的能力，這些資料庫包含了 db4o、Firebird、Microsoft SQL Server（MSSQL）、MySQL、Open Database Connectivity（ODBC）、Oracle、PostgreSQL、SQLite等等。在網站上可看見Mono專案一直都在持續更新維護資料庫程式庫。

微軟相容堆疊則是提供了一種方式來使得Windows .NET應用程式可以被移植到GNU/Linux上。這個堆疊包含了ADO.NET、ASP.NET以及Windows Forms等等。不過，由於這些元件並沒有被上述所說Ecma標準所涵蓋，因此部份元件有所謂專利恐懼與疑慮的問題。

 架构 

400px|right

程式執行引擎
Mono程式的執行包含一個程式碼運作引擎，它會將ECMA CIL的byte code轉譯為原生碼（Native Code），它支援了以下處理器：ARM、MIPS（只有32位元模式）、SPARC、PowerPC、S390（64位元模式）、x86、x86-64以及IA-64 64位元模式。

程式的轉譯有三種模式：
 Just-in-time (JIT)編譯：在程式執行當中將ECMA CIL的byte code轉譯為原生碼。
 Ahead-of-Time (AOT)編譯：ECMA CIL的byte code（通常在.exe檔或.dll檔中）會轉譯出原生碼並儲存在作業系統中、以及CPU架構設定檔（例如在Linux上，如果是foo.exe，就會產生foo.exe.so檔）。通常，此種模式可產生出絕大部份前種模式所產生的原生碼，部份的例外是trampolines或是控管監督相關的碼（仍舊需要JIT來執行），由此可知AOT影像檔並非可以完全獨立執行的。

 完全靜態編譯：這個模式只支援少數平台，它基於AOT編譯模式上，更進一步產生所有的trampoline、wrappers以及proxies，這幾樣東西是用於靜態連結出靜態檔案時所需。完全靜態編譯模式可以讓程式的執行期完全不需要用到JIT，這個做法適用於Apple iOS作業系統、Sony PlayStation 3以及微軟的XBox 360等作業系統。

從2.6版起，Mono開始支援使用LLVM來產生執行碼，而非原本自帶的方式。這對於高效能計算方面非常有用，因為在這種場合下，程式的執行效能比啟動速度來得重要。

從2.7 Preview版開始，使用者不再需要在程式編譯前的Configuration時就必須選定執行碼產生引擎，執行碼的產生可以在程式啟動時以--llvm或--nollvm的參數來指定即可，預設是以自帶的引擎為主，因為它的產生速度比較快。

垃圾回收
當2.8版推出時，Mono runtime提供了兩套垃圾回收器：generational collector以及Boehm conservative collector。在Mono 3.1.1版之前，預設的垃圾回收器（Boehm-Demers-Weiser Conservative Garbage Collector），跟商業環境如Java Virtual Machine或.NET framework的垃圾回收器相比，一直有很大的限制，在某些狀況的應用軟體上會發生内存泄漏的現象，這使得Mono無法用於需要長時間執行的伺服器應用。

，一個稱之為「Simple Generational GC」（SGen-GC）的新一代垃圾回收器開始用於Mono中，在3.1.1版之後就直接變成是預設的垃圾回收器。對於Mono 2.8到3.1.0，使用者可以以傳入參數--gc=sgen來讓Mono runtime啟動時使用SGen垃圾回收器。這個新的垃圾回收器相較於傳統基於保守型掃描方式的回收器，有很多優點，它使用了generational garbage collection，從物件一開始被配置、到各個週期，所有活著的物件都會被轉移到較早代的記憶體池，這個想法是來自於因為許多物件都只是短暫使用的，因此可以被快速回收再利用，只有少數物件是長期性的存活在應用程式的整個生命期中。另外，為了改善效率，這個回收器對每個執行緒配置了個別的記憶體池，讓執行緒不需要跟別的執行緒打交道就可以自行配置記憶體區塊。對於前述所說，物件的轉移到較早代記憶體池的做法則是，在轉移之後，將所有目前指向該物件的指標都更新為新的位址。由於這樣的做法在大型物件時比較浪費記憶體，因此SGen為大型物件使用了獨自的記憶體池（Large Object Section），並且對這些物件使用mark-and-sweep演算法。

目前SGen是以比較保守的方式來對待堆疊與暫存器，並且，那些可被參考到的物件是由它們的root來負責pin的動作。未來版本的Mono將會以精確方式來掃描託管的堆疊，藉此減少那些被pin的物件。

 類別庫 

類別庫为应用程序开发提供一套广泛而有效的工具类。这些工具类可以用于任何.NET语言。類別庫被按命名空间进行了结构化，并被放置于称为程序集的共享库中。在我们谈到.NET Framework时，我们多数是指这个类库。

 命名空间和程序集 

命名空间是一种用于将逻辑上相似的类按层次结构分组的机制。这种机制防止了命名冲突。在这种结构化采用被点号"."分隔的单词来实现。通常最顶层的命名空间是System，例如System.IO和System.Net（完整的命名空间列表可以在Mono文档Mono文档中找到）。当然还有别的顶层命名空间，例如Accessibility和Windows就是这样的例子。新建的命名空间还可以以开发组织的名字开头。

程序集是这些类库的物理载体。它们跟Win32共享库一样都是dll文件，尽管不完全一样。一些程序集的例子有：mscorlib.dll，System.dll，System.Data.dll和Accessibility.dll。命名空间经常被分拆到几个程序集中，而一个程序集可以由几个文件组成。

 公共语言基础和公共语言规范 

公共语言基础（Common Language Infrastructure，CLI）是一套标准（ECMA335），公共语言运行时（Common Language Runtime）即CLR是CLI标准的实现，Mono是实现者之一。该运行时用于执行已编译的.NET应用程序。公共语言基础已被ECMA定义为标准ECMA-335。要运行一个.NET应用程序，你必须使用相应的参数调用运行时。

在ECMA-335的第六章详细说明了「公共语言规范」（Common Language Specification，CLS）并定义了提供给公共语言基础的接口，例如对于枚举类型的隐含表示类型的协定。Mono的编译器负责生成符合公共语言规范的映射代码，即公共中间语言（Common Intermediate Language，CIL）。Mono的运行时将运行这类代码。ECMA标准先前还定义了一个符合公共语言规范的程序库作为应用框架。

 托管与非托管代码 

在原生的.NET/Mono应用程序中，所有代码都是托管的，也就是说，是受管于CLI式的内存管理和线程安全管理的。其它的.NET或Mono应用程序可以通过使用System.InterOpServices库创建C#绑定来调用已存的非托管代码。很多移植到Mono的类库使用了CLI的这个特性，例如Gtk#。

 相关项目 

现有大量与Mono相关的用于扩展Mono的项目，这些项目允许开发者在他们的开发环境中使用Mono。这些项目包括：
 Cocoa#Cocoa#，对原生Mac OS X工具包的一系列包装（Cocoa）。
 Gecko#，一个对在Mozilla中使用的嵌入式布局引擎的绑定（Gecko）。
 Gtk#，对使用C的GTK+库的C#的外包。
 Tao，一个图形及游戏库的绑定。

 授權 
Mono是透過Xamarin的雙重授權，相似於其他產品，如Qt和Mozilla application Suite。Mono's C#編譯器與工具是依照GNU Leasser General Public License（LGPLv2 only）來釋出（開始於Mono 2.0，Mono C#的編譯器源碼在MIT X11 License仍然是有效的），屬於GNU Leasser General Public License（LGPLv2 only）的runtime函式庫及屬於MIT X11 License的類別函式庫。

有完全免費的軟體與開源授權，因此Mono是免費的開源軟體。

C#編譯器的授權改變是從GPL到MIT X11授權，允許編譯器的程式碼在少許的GPL限制例子中被重複使用，如例：

 作為服務的Mono編譯器
  * Mono互動介面的Shell
  * Mono可崁入的的C#編譯器
 Mono的C# 4.0的動態綁定的實作
 MonoDevelop的內建parser和AST圖

 Mono与微软的专利 

人们对于微软能否采用专利摧毁Mono项目进行了大量的争论。其实，专利问题不在于已被提交到ECMA组织的核心技术或Unix/Gnome的专有部分，而在于由微软基于.NET Framework创建的技术，例如ASP.NET、ADO.NET和Windows Forms。这些技术在Mono中至今还没有被完全地实现，事实上，在开发Mono应用程序时也不需要用到，然而，在开发基于Windows平台的程序时却是不可缺少的。Mono团队将目标定为将这些技术纳入到项目中，并制订了一个三步驟策略来处理它们：

 采用其它实现方式来实现从而绕过专利问题
 把包含专利的代码清除出项目
 找出“现有技术（prior art）”从而将专利变为非专利

显然，第一个选项并不总是可行的。对于一些问题，例如那些与协同工作和交互相关的，可能就只有一种解决方案。由于这个相同的原因，尽管第二个选项总是可行的，它却可能导致一个开发出来的产品并不能作为.NET的替代品。第三个选项则是昂贵的，甚至不可能的，这需要一定程度的运气。

 使用Mono开发的软件 

以下是使用Mono API和C#编写的部分程序：

 Banshee是一个用于GNOME的音乐管理和播放软件。
 Beagle是一个桌面搜索软件。
 Blam!是一个RSS 新闻聚集器，特别适合于阅读如Planet GnomePlanet Gnome这样的行星行星资讯。
 BlessBless是一个十六进制编辑器。
 CDCollectCDCollect是一个CD 编目应用程序。
 Diva是一个用于GNOME的视频编辑器。
 F-Spot是有个由Novell开发的图片便捷管理程序。
 FiddlerFiddler是一个强大的Web 抓包工具，与Charles齐名。
 GalaxiumGalaxium是一个MSN 即时通讯软件客户端。
 GLyricsGLyrics是一个歌词搜索器。
 GpremacyGpremacy是以Mono/Gtk# 實作的圖版遊戲Supremacy
 iFolder 3（by Novell）让你使用点对点协议（peer-to-peer）或Novell的群集服务器产品与其它计算机和用户共享文件。
 imeemimeem一個社交網路軟體。Mac版本的用戶端和伺服器使用Mono運行，而Windows版本的用戶端仰賴於Microsoft.Net
 KeePass是一款開源的密碼管理器。
 MindFireMindFire是一个用于辅助速读（speed reading）的跨平台电子书阅读器
 MonoDevelop是一个用于创建Mono应用程序的集成开发环境。该软件原先是SharpDevelop向Gtk#的一个移植，而现今该软件已独立开发。该软件在Windows上有测试版的可用版本。
 Pinta是一个简单的位图形编辑软件。

 分支版本 
2011年4月，Novell公司被公司所併購，而原先在Novell公司裡的Mono開發者被大量資遣。2011年5月，原先Mono的開發者另外成立一家Xamarin的公司，仿Mono發行他們的Xamarin跨平台.NET套件，在Windows下能與整合到Microsoft Visual Studio的IDE之中。2011年7月，公司旗下的Novell公司批准了Mono相關專案到Xamarin的授權。

 备注 

 For more information about the licensing, see Mono FAQ: Licensing

 参考文献 

 This article incorporates text from Mono's homepage，which is in the GNU Free Documentation License.




 外部链接 
 GotMono?, Mono community homepage
 Mono Forum
 Mono Live，LiveCD website
 Running .NET on Linux or Windows
 Ximian Forum
 Slashdot: Fedora Core 5 includes Mono
 Novell, Inc.

国际站点
 Mono France，A French Mono WebSite
 MonoBrasil，A Brazilian Mono WebSite
 MonoColombia，A Colombian Mono WebSite
 MonoGermany，A German Mono WebSite
 MonoHispano，A Spanish Mono community
 Japanese Mono Mono web site translation to Japanese.
 MonoPoland，Polish Mono Web site.
 Mono Netherlands，Dutch Mono site.

Category:计算平台
Category:程序设计工具
Category:.NET
Category:Novell軟件