日期:2014-05-20  浏览次数:20850 次

最近可能要用到Mono了,找了点资料,分享下
Mono 是一个由 Novell 公司(先前是 Ximian)主持的项目。该项目的目标是创建一系列符合 ECMA 标准(Ecma-334 和 Ecma-335)的 .NET 工具,包括 C# 编译器和共通語言執行平臺。与微软的 .NET Framework 不同,Mono 项目不仅可以运行于 Windows 系统上,还可以运行于 Linux,FreeBSD,Unix,Mac OS X 和 Solaris。

Mono 现由 Novell 持有双重许可,这和 Qt 和 Mozilla 应用程序套件的情况相似。 Mono 的 C# 编译器及其相关工具发布于 GNU General Public License(GPL)之下,其运行时库发布于 GNU Lesser General Public License(LGPL)之下,其类库发布于 MIT License 之下。这些均是开源协议因此 Mono 是一个开源软件。如果你打算向 Mono 贡献你的源码,则你须签署一个版权分派给 Novell 以允许它将这些代码在其它协议下再申请许可,从而允许 Novell 保留其双重许可的能力来持有 Mono 的商业协议。

微软开发了一个称为共享源码公共语言基础(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。该虚拟机可以将代码实时编译或者预先编译到原生代码。对于那些没有列出来的系统,则使用的是代码解释器。

历史
Miguel de Icaza 在 .NET 的文档于2000年10月发布时就马上对 .NET 产生了兴趣。在查看字节码解释器后,他发现对于元数据(metadata)没有相应的说明文档。2001年2月,de Icaza 在 .NET 邮件列表中索要到了那段缺失了的关于元数据文件格式的信息,并开始了采用 C# 编写一个 C# 编译器的工作,作为对 C# 的实践。2001年4月 ECMA 公布了那段缺失的文件格式,而在 GUADEC(2001年4月6日-4月8日)de Icaza 展示了他的编译器的一些特性(那个时候他的编译可以解释自身)。

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

差不多三年后,Mono 于2004年7月30日发布了1.0版本。

架构

类库
类库为应用程序开发提供一套广泛而有效的工具类。这些工具类本是采用 C# 编写的,但是由于 .NET 采用的公共语言运行时,它们可以用于任何 .NET 语言。类库被按命名空间进行了结构化,并被放置于称为程序集的共享库中。在我们谈到 .NET framework 时,我们多数是指这个类库。

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

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

公共语言基础和公共语言规范
公共语言基础(Common Language Infrastructure,CLI),又叫公共语言运行时(Common Language Runtime),已由 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#,对原生 Mac OS X 工具包的一系列包装(Cocoa)。 
Gecko#,一个对在 Mozilla 中使用的嵌入式布局引擎的绑定(Gecko). 
Gtk#,对使用 C 的 GTK+ 库的 C# 的外包。 
Tao,一个图形及游戏库的绑定。 

Mono 与微软的专利
人们对于微软能否采用专利摧毁 Mono 项目进行了大量的争论。其实,专利问题不在于已被提交到 ECMA 组织的核心技术或 Unix/Gnome 的专有部分,而在于由微软基于 .NET Framework 创建的技术,例如 ASP.NET,ADO.NET 和 Windows Forms。这些技术在 Mono 中至今还没有被完全地实现,事实上,在开发 Mono 应用程序时也不需要用到,然而,在开发基于 Windows 平台的程序时却是不可缺少的。Mono 团队将目标定为将这些技术纳入到项目中,并制订了一个三步走策略来处理它们:
1.采用其它实现方式来实现从而绕过专利问题 
2.把包含专利的代码清除出项目 
3.找出“现有技术(prior art)”从而将专利变为非专利 
显然,第一个选项并不总是可行的。对于一些问题,例如那些与协同工作和交互相关的,可能就只有一种解决方案。由于这个相同的原因,尽管第二个选项总是可行的,它却可能导致一个开发出来的产品并不能作为 .NET 的替代品。第三个选项则是昂贵的,甚至不可能的,这需要一定程度的运气。


使用 Mono 开发的软件
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 开发的图片便捷管理程序。 
Galaxium 是一个 MSN 即时通讯软件客户端。 
GLyrics 是一个歌词搜索器。 
Gpremacy is an implementation of the board game Supremacy written in Mono/Gtk#.