开源软件Mono框架和架构

摘要:
与微软的.NETFramework不同,Mono项目不仅可以运行于Windows系统上,还可以运行于Linux,FreeBSD,Unix,MacOSX和Solaris。Mono现由Novell持有双重许可,这和Qt和Mozilla应用程序套件的情况相似。这些均是开源协议因此Mono是一个开源软件。[1]微软开发了一个称为共享源码公共语言基础的可用于FreeBSD,Windows和MacOSX的.NET实现版本。由于缺少人力来创建整个.NET替代产品,他们在2001年7月19日的歐萊禮大会创建了Mono的开源项目。差不多三年后,Mono于2004年7月30日发布了1.0版本。Mono的运行时将运行这类代码。

http://www.mono-project.com/Main_Page

http://zh.wikipedia.org/zh/Mono

Mono是一个由Novell公司(先前是Ximian)主持的项目。该项目的目标是创建一系列符合ECMA标准(Ecma-334Ecma-335)的.NET工具,包括C#编译器和共通語言執行平臺。与微软的.NET Framework不同,Mono项目不仅可以运行于Windows系统上,还可以运行于LinuxFreeBSDUnixMac OS XSolaris

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

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

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

目录

[隐藏]

[编辑]历史

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

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

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

[编辑]架构

Mono architecture.svg

[编辑]

类库为应用程序开发提供一套广泛而有效的工具类。这些工具类本是采用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#,对使用CGTK+库的C#的外包。
  • Tao,一个图形及游戏库的绑定。

[编辑]Mono与微软的专利

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

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

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

[编辑]使用Mono开发的软件

开源软件Mono框架和架构第2张
开源软件Mono框架和架构第3张
F-Spot photo management program
开源软件Mono框架和架构第4张
开源软件Mono框架和架构第3张
Muine music player

以下是使用MonoAPIC#编写的部分程序:

[编辑]备注

  1. ^For more information about the licensing, seeMono FAQ: Licensing

[编辑]参考文献

[编辑]外部链接

[编辑]国际站点

免责声明:文章转载自《开源软件Mono框架和架构》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇shell 脚本 检测域名是否正常Windows 安装mysql及修改默认文件存储路径下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Mono.Cecil

Mono Cecil十分强大,强大到可以静态注入程序集(注入后生成新的程序集)和动态注入程序集(注入后不改变目标程序集,只在运行时改变程序集行为),它甚至可以用来调试PDB MDB调试符号格式文件。 注:仔细看了下,并不支持“动态”注入,cecil只支持从硬盘加载或从内存读取一个已经被加载了的assembly,然后修改它的副本,最后另存为或者直接调用这个副...

.net4.5部署到docker容器

.net4.5部署到docker容器 部署到windows容器 部署到linux容器 部署到windows容器 由于.net本身就是运行在windows平台的,所以它与windows容器也是更加适合,你可以以iis镜像为基础,去编写你的Dockerfile文件,从而去构建你的.net项目镜像。 两个现成的例子 .net console程序 docker...

在centos 7.0上利用yum一键安装mono

首先我们需要先配置一下yum源中mono的引用说明: 第一步: vi /etc/yum.repos.d/mono.repo 第二步:在刚打开的文件中编辑如下内容 [mono]name=monobaseurl=http://download.mono-project.com/repo/centos/enabled=1gpgcheck=0第三步:保存退出 y...

Unity3D脚本语言UnityScript初探

译者注: Unity3D中支持三种语言:JavaScript、C#、Boo,很多人不知道如何选择,通过这篇译文,我们可以搞清楚这三者语言的来龙去脉,对选择主语言有一定的借鉴意义。 首先,Unity是基于Mono也就是.Net的运行环境的,所以它肯定支持C#;然后,Unity团队自行开发了一种Boo的语言;后面可能考虑到用户的接受程度的问题,又开发了类似J...

ubuntu中下运行asp.net程序

首先在ubuntu下面是不能直接运行VISUAL STUTIO的,必须借助mono开发工具和xsp4.0.那我们就来看一下在ubuntu的电脑中怎么安装这两个工具。 首先安装mono,打开终端,输入apt-get install monoDevelop.(或者在ubuntu软件中心中输入mono然后点击安装)。 然后安装mono之后,你在打开mono,首...

.net跨平台解决方案mono真正实现C#代码一次编写处处运行

转载于:http://www.cnblogs.com/softwarelanguagebs/archive/2011/09/16/mono.html  2000年微软正式推出.net战略平台,凭借强大的开发环境ide—visual studio和对多种编程语言的支持(包括vb,vc++,c#,f#)和丰富的开发交流社区及易用的windows 服务器环境而...