Mono 是一個由Novell公司(由Ximian發(fā)起,并由Miguel de lcazaling dao的,一個致力于開創(chuàng).NET在Linux上使用的開源工程。它包含了一個C#語言的編譯器,一個CLR的運行時,和一組類庫,并實現(xiàn)了 ADO.NET和ASP.NET。能夠使得開發(fā)人員在Linux用C#開發(fā)程序。)主持的項目.該項目的目標是創(chuàng)建一系列符合標準ECMA (Ecma-334和Ecma-335)的.Net 工具, 包括C #編譯器和公共語言(CL 即 Common Language)執(zhí)行平臺(Platform).與微軟的.Net不同, Mono項目不僅可以運行于Windows系統(tǒng)內(nèi),還可以運行于Linux, FreeBSD, Unix, Mac OS X和Solaris.
Mono現(xiàn)由Novell持有雙重許可, Qt和這和Mozilla應用程序套件的情況相似.Mono的 C #編譯器及其相關(guān)工具發(fā)布于GNU General Public License (GPL)之下,其運行時庫發(fā)布于GNU Lesser General Public License (LGPL)之下,其類庫發(fā)布于MIT License之下.這些均是開源協(xié)議因此Mono是一個開源軟件.如果你打算向Mono貢獻你的源碼,則你須簽署一個版權(quán)分派給Novell以允許它將這些代碼在其它協(xié)議下再申請許可,從而允許Novell保留其雙重許可的能力來持有Mono的商業(yè)協(xié)議.
微軟開發(fā)了一個稱為共享源碼公共語言基礎(chǔ)(Shared Source Common Language Infrastructure, Shared Source CLI)的可用于FreeBSD, Windows Mac OS X的和. NET實現(xiàn)版本.微軟的共享源碼協(xié)議并不是開源軟件協(xié)議,且可能對于社區(qū)來說也是不足夠的(它明文禁止了對軟件的商業(yè)用途).我們還可以見到另外一個. NET實現(xiàn)版本, Portable.NET項目,該項目與Mono項目有著很多相同的目標.
Mono虛擬機包含一個實時編譯引擎,該引擎可用于如下處理器: x86, SPARC, PowerPC, ARM, S390 (32位模式和位模式64), x86-64, IA64和64位模式的SPARC.該虛擬機可以將代碼實時編譯或者預先編譯到原生代碼.對于那些沒有列出來的系統(tǒng),則使用的是代碼解釋器.
歷史
Miguel de Icaza在. NET的文檔于2000年10月發(fā)布時就對. NET產(chǎn)生了興趣.在查看字節(jié)碼解釋器后,他發(fā)現(xiàn)對于元數(shù)據(jù)(metadata)沒有相應的說明文檔.2001年2月, deIcaza在. NET郵件列表中索要到了那段缺失了的關(guān)于元數(shù)據(jù)文件格式的信息,并開始了采用編寫一個C #編譯器的工作,作為對的實踐C #. 2001年4月ECMA公布了那段缺失的文件格式,而在GUADEC (2001年4月6日- 8月4日) deIcaza展示了他的編譯器的一些特性(那個時候他的編譯可以解釋自身).
Ximian內(nèi)部對如何創(chuàng)建能有效提升生產(chǎn)效率的工具進行了大量的討論,他們的目標是通過這些創(chuàng)建出來的工具讓使用者可以在更短時間內(nèi)創(chuàng)建出更多的應用程序從而縮短開發(fā)周期和降低開發(fā)成本.經(jīng)過可行性研究后,他們清楚地見到創(chuàng)建這樣的一項技術(shù)是可行的,于是Ximian從其它的項目抽調(diào)人員并創(chuàng)建了的開發(fā)小組Mono.由于缺少人力來創(chuàng)建整個. NET替代產(chǎn)品,他們在2001年7月19日的O'Reilly大會創(chuàng)建了的開源項目Mono.
差不多三年后, Mono于2004年7月30日發(fā)布了1.0版本.
架構(gòu)
? 類庫
類庫為應用程序開發(fā)提供一套廣泛而有效的工具類。這些工具類本是采用C#編寫的,但是由于.NET采用的公共語言運行時,它們可以用于任何.NET語言。類庫被按命名空間進行了結(jié)構(gòu)化,并被放置于稱為程序集的共享庫中。在我們談到.NET framework時,我們多數(shù)是指這個類庫。
? 命名空間和程序集
命名空間是一種用于將邏輯上相似的類按層次結(jié)構(gòu)分組的機制。這種機制防止了命名沖突。在這種結(jié)構(gòu)化采用被點號"."分隔的單詞來實現(xiàn)。通常最頂層的命名空間是System,例如System.IO和System.Net(完整的命名空間列表可以在 Mono文檔中找到)。當然還有別的頂層命名空間,例如Accessibility和Windows就是這樣的例子。新建的命名空間還可以以開發(fā)組織的名字開頭。
程序集是這些類庫的物理載體。它們跟Win32共享庫一樣都是dll文件,盡管不完全一樣。一些程序集的例子有:mscorlib.dll,System.dll,System.Data.dll和Accessibility.dll。命名空間經(jīng)常被分拆到幾個程序集中,而一個程序集可以由幾個文件組成。
? 公共語言基礎(chǔ)和公共語言規(guī)范
公共語言基礎(chǔ)(Common Language Infrastructure,CLI),又叫公共語言運行時(Common Language Runtime),已由Mono實現(xiàn)。該運行時用于執(zhí)行已編譯的.NET應用程序。公共語言基礎(chǔ)已被ECMA定義為標準ECMA-335。要運行一個.NET應用程序,你必須使用相應的參數(shù)調(diào)用運行時。
在ECMA-335的第六章詳細說明了公共語言規(guī)范(Common Language Specification,CLS)并定義了提供給公共語言基礎(chǔ)的接口,例如對于枚舉類型的隱含表示類型的協(xié)定。 Mono的編譯器負責生成符合公共語言規(guī)范的映射代碼,即公共中間語言(Common Intermediate Language,CIL)。 Mono的運行時將運行這類代碼。 ECMA標準先前還定義了一個符合公共語言規(guī)范的程序庫作為應用框架。
? 托管與非托管代碼
在原生的.NET/Mono應用程序中,所有代碼都是托管的,也就是說,是受管于CLI式的內(nèi)存管理和線程安全管理的。其它的.NET或Mono應用程序可以通過使用System.InterOpServices庫創(chuàng)建C#綁定來調(diào)用已存的非托管代碼。很多移植到Mono的類庫使用了CLI的這個特性,例如Gtk#。
? 相關(guān)項目
現(xiàn)有大量與Mono相關(guān)的用于擴展Mono的項目,這些項目允許開發(fā)者在他們的開發(fā)環(huán)境中使用 Mono。這些項目包括:
Cocoa#,對原生Mac OS X工具包的一系列包裝(Cocoa)。
Gecko#,一個對在Mozilla中使用的嵌入式布局引擎的綁定(Gecko).
Gtk#,對使用C的GTK+庫的C#的外包。
Tao,一個圖形及游戲庫的綁定。
Mono與微軟的專利
人們對于微軟能否采用專利摧毀Mono項目進行了大量的爭論。其實,專利問題不在于已被提交到 ECMA組織的核心技術(shù)或Unix/Gnome的專有部分,而在于由微軟基于.NET Framework創(chuàng)建的技術(shù),例如ASP.NET,ADO.NET和Windows Forms。這些技術(shù)在Mono中至今還沒有被完全地實現(xiàn),事實上,在開發(fā)Mono應用程序時也不需要用到,然而,在開發(fā)基于Windows平臺的程序時卻是不可缺少的。 Mono團隊將目標定為將這些技術(shù)納入到項目中,并制訂了一個三步走策略來處理它們:
采用其它實現(xiàn)方式來實現(xiàn)從而繞過專利問題
把包含專利的代碼清除出項目
找出“現(xiàn)有技術(shù)(prior art)”從而將專利變?yōu)榉菍@?/p>
顯然,第一個選項并不總是可行的。對于一些問題,例如那些與協(xié)同工作和交互相關(guān)的,可能就只有一種解決方案。由于這個相同的原因,盡管第一個選項總是可行的,它卻可能導致一個開發(fā)出來的產(chǎn)品并不能作為.NET的替代品。第三個選項則是昂貴的,甚至不可能的,這需要一定程度的運氣。
使用Mono開發(fā)的軟件
F-Spot photo management program
Muine music player以下是使用Mono API和C#編寫的部分程序:
Banshee是一個用于GNOME的音樂管理和播放軟件。
Beagle是一個桌面搜索軟件。
Blam!是一個RSS新聞聚集器,特別適合于閱讀如Planet Gnome這樣的行星資訊。
Bless是一個十六進制編輯器.
CDCollect是一個CD編目應用程序。
Diva是一個用于GNOME的視頻編輯器。
F-Spot是有個由Novell開發(fā)的圖片便捷管理程序。
Galaxium是一個MSN即時通訊軟件客戶端。
GLyrics是一個歌詞搜索器。
Gpremacy is an implementation of the board game Supremacy written in Mono/Gtk#.
iFolder 3 (by Novell) lets you share files across multiple computers and with other users through peer-to-peer or Novell's groupware server products.
imeem a social networking software. Mac client and servers run Mono while the Windows client uses Microsoft.NET.
MindFire是一個用于輔助速讀(speed reading)的跨平臺電子書閱讀器
MonoDevelop是一個用于創(chuàng)建Mono應用程序的集成開發(fā)環(huán)境。該軟件原先是 SharpDevelop向Gtk#的一個移植,而現(xiàn)今該軟件已獨立開發(fā)。該軟件在Windows上沒有可用版本。
新聞熱點
疑難解答
圖片精選