1Mono介绍本章内容 ü Mono项目的历史ü Mono项目当前的情况ü Mono的意义ü Mono架构的一些知识 1.1 C#和Mono项目的历史时间应该追溯到公元1998年的晚些时候,或者再往前些,在1996年,比尔盖茨如愿以偿的挖到了赫赫有名的编译器大师 Anders Hejlsberg。Anders Hejlsberg曾在丹麦科技大学学习工程学,他编写的Pascal编译器的核心,1981年将Pascal编译器卖给了Borland,并加入 Borland公司,那时的Borland公司还是一个名不见经传的小公司。Anders Hejlsberg在Borland主持开发了Turbo Pascal,Turbo Pascal获得一直好评,Anders Hejlsberg并未止步不前,他将Turbo Pascal编程一种面向对象的、拥有可视化环境和卓越的数据库访问特性的应用程序开发语言-Delphi。Java出现了。Anders Hejlsberg在Borland一直郁郁不得志,据Borland内部人士讲Anders Hejlsberg认为自己不再是不可或缺的人。比尔盖茨慧眼识才,三故茅庐,把Anders Hejlsberg请到了微软。最开始微软许以重金,但Anders Hejlsberg不为所动,当清楚Anders Hejlsberg的想法后,比尔盖茨答应给他一个宽松的环境,既领导Visual J++小组,并提供薪水和红利奖金300万美元。这样Borland这个大牛孵化器为微软输送了一位超级大牛。好景不长,SUN公司认为微软破坏了 java的跨平台性,微软太有侵略性了,很快微软就会利用它的VJ++将java开发人员拉拢到它的周围,而它的VJ++以及WFC的很多特性明显是为了 Windows平台设计。SUN中止了对微软的java授权。 1998年的时候,危机感促使微软决心开发一个新的平台。这是一件伟大而艰巨的任务,可以说对微软的未来有举足轻重的意义,谁来承担此重任并成为开发C# 的首席设计师呢?微软选择了Anders Hejlsberg。 在开发领域,人们很少有对一种还处于beta版的软件抱有那么大的热情,当初我下载了vs studio.net 的beta1、beta2的时候,完全被它折服了,并开始在公司中利用它开发OA系统。 微软的.NET可以说是跨平台的,但这里的平台指Windows CE,用在PDA等设备上。微软也提供了一个供FreeBSD上的.NET平台源代码。从.NET的类库上和编译器的编译参数上看,微软的.NET是可以 做到跨平台的。但比尔盖茨或许天生有种侵略的思想,他不会允许发布一个运行在Linux的平台,在他的理念里,开发人员只能生活在他所掌控的 Windows的世界里,整个世界都要源源不断的往他的口袋里塞钱,他不会把大批的开发人员吸引到一个对他日益危险的敌人(Linux)上。从收购 Virtual PC就可以看出这一点,自从微软收购了Virtual PC,以后发布的版本里面已经将Linux的选项去除了(当然,现在的新的版本中又增加了,再牛也拗过市场啊),现在很多开发人员选择了vmware做虚 拟机。 开源阵营里拥有众多的超级大牛。这群抱有极大的热情和拥有聪明大脑的大牛们创造出了无数的令人称道的软件。既然微软不提供Linux下的.NET平台的实 现,那么我们就自己实现它。2001年7月Ximian的Miguel de Icaza负责开发Mono项目,用以实现跨平台的.NET。现在GNU也拥有了一个项目Portable.net,也是一种跨平台的.NET实现。 说起Miguel de Icaza,你也许有些陌生,但是说道GNOME,Linuxer没有不知道的,Miguel de Icaza正是GNOME的发起人。1996年(这也是微软挖Anders Hejlsberg的那一年,也正处于自由软件发展的年代),墨西哥籍青年Miguel de Icaza正在为Linux/SGI工作。他和他的在Red Hat工作的朋友Elliot Lee时常讨论自由软件的话题。这两个人都不约而同地感觉到,相对而言,自由软件体系缺乏很多技术元素,使得其在很多领域落在后面。当时,KDE项目进展 得十分顺利,并且功能已经相对完善。Icaza对此感到十分高兴,并写信给他们建议把KDE的代码纳入Red Hat发行版,还曾致信给Richard Stallman(GNU组织者),让他了解有这样一个有趣的项目存在(KDE当时是基于GNU GPL的项目)。但Icaza很快得到回信:Qt是商业软件,不允许用户修改或发行修改后的拷贝,因而违反了GPL的相关条例;而KDE对Qt的依赖性导 致其中的部分程序是非自由软件。出于对自由软件的热爱,Icaza也曾与Qt的所有者Troll Tech取得联系,希望可以修改Qt的相关许可规则,但是始终没有得到回复。经过一段时间的等待后,他决定自己亲自组织一个Linux桌面系统的项目。在 1997年的夏季,Icaza受一个朋友的邀请来到微软,开发基于SPARC的Internet Explorer for Solaris系统(因为其技术专长就是Linux/SPARC)。在微软,他学到了一些关于ActiveX和COM的知识,并开始对这种技术非常着迷。 我想,这对他将来开发GNOME Bonobo组件架构身有影响。在那里,他还巧遇了一直以来在LinuxNet IRC交流的几个网友。当他再次返回墨西哥时,便与Federico着手设计一套GUI控制的基础构架(基于Unix系统),并将其命名为GNOME。 1997年8月,GNOME项目正式启动,26岁的Icaza和墨西哥国立自治大学计算机科学专业的学生Federico便着手在GIMP、Guile邮 件列表、GNU项目声明邮件列表中分发了项目声明,以此来吸引更多的人加入。邮件列表发挥了重要作用,很快,项目便增加到250人,参与者们使用 CORBA作为组件结构的基础,并使用DocBook来写GNOME的文件系统。gnome.org社区成立,11月,Icaza和Federico推掉 了其它项目,全身心地投入到开发中来。12月,与Red Hat取得合作;1998年1月,共同建立了Red Hat高级开发实验室(Red Hat Advanced Development Labs)。这是为改进GNOME而成立的第一开发梯队。1998年11月,Qt 2.0即将发布之际,该软件公布了一个新的许可协议,以便配合开放源码的定义。这项声明使得Harmony(克隆Qt API的免费软件)彻底地垮台,同时也使人们的视线从刚起步的GNOME身上转移到KDE身上。同时,由于GNOME开发14个月,1.0的版本存在着众 多的BUG,才给GNOME带来了坏名声。RedHat5.0发布的时候包含了GNOME1.0,也包含了KDE。1999年4月,Icaza和其他人合 伙成立了Helix Code,后来改名为Ximian,Icaza任CIO。这是一个公开源代码的软件公司,提供GNOME的商业版本和套件。在2000年8月举行的 Linux World展会上,GNOME基金会宣布成立。Icaza任总裁。Ximian公司在2001年7月开始启动一个名叫Mono Project的开放源码版“.NET”的开发项目,Icaza组织开发。Mono在西班牙语中意思是“猴子”,因为他们喜欢猴子,所以起了这样一个名 字,读起来感觉还不错,简短、易记、好发音。旨在使开发者能够编写同时在Windows和Linux上运行的.NET程序,Mono计划主要包括一个C# 编译器、与微软公司的Common Language Infrastructure(CLI)兼容的类库、Linux版Common Language Runtime(CLR)编译器。Miguel de Icaza说:“虽然微软公司已向欧洲电子计算机工业协会(ECMA:European Computer Manufacturers' Association)以及World Wide Web Consortium(W3C)的标准化机关提交了c#及CLI的标准(现已获得通过),但因为该公司的共享(Shared Source)授权仅限于部分对象,所以不能开发面向Linux或UNIX等平台的应用程序。而我们将提供的是能够自由进行应用程序开发或提供Web服务 的工具,令Linux用户也能够享受到NET平台的巨大好处。”下面再介绍一下Novell公司。在上世纪70年代初,一家名为Novell的小公司成立 了,一开始Novell是一家专业的网络公司,它开发了高性能的Novell局域网产品。在80年代初,Novell推出它的Netware网络操作系 统,几乎一夜之间,NetWare成为办公室应用的“权威”,它允许各个个人电脑访问共享打印机,发送电子信函,交换文件和访问中央数据 库,Netware于1989年被国际ISO组织选定为局域网工业标准。这个具有许多一流技术的操作系统很快得到市场上的欢迎,但一开始运行 Netware一定需要购买以太网设备,所以Novell开始售卖以太网适配卡。后来,Novell开始向任何需要它的Novell Engineering(NK)以太网适配卡设计的人出售许可证,从而出现了庞大的NE2000仿制生意,就像仿制IBM的兼容PC机一样,曾经有一段时 间,市场上的网卡大多都是NE2000兼容型。以前,当我安装网卡,找不到网卡的驱动的时,我还会选择NE2000兼容型驱动暂时充数。 到90年代初,Novell推出它具有历史意义的Netware 3.12网络操作系统,这款经典的网络操作系统让Novell到达了它事业的顶峰,奠定了它以太网王国至尊的地位。Netware 3.12是Novell销售最多的产品,它打败了IBM的PCNET,当我还在科大上学的时候,学校机房里还采用Netware网络操作系统。 风云变换,Novell被微软打败了。Netware几乎退出了网络操作系统的舞台,取而代之的时WIN NT和Linux。 Novell需要以一种凤凰涅磐的方式获得新生。 2003年1月,Novell收购了SUSE Linux。这是一家仅次于Redhat的Linux发行公司。8月, Novell收购了Ximian。 XImian被Novell收购后,Mono项目继续开发。2004年6月30号,Mono发布了它的第一个版本。1.2 Mono项目当前的情况Miguel de Icaza说Mono项目的起因是GNOME社团特别是Ximain公司对于一个改进的开发工具的需要。但是Mono项目的影响确是更加深远的,因为这些 开发工具是基于CLI(通用语言架构)和微软提交给欧洲计算机制造协会(ECMA)的C#实现标准的。现在,Mono不仅仅可以运行再Linux平台下, 也可以运行在Windows、Max OS等操作系统下。Ximian计划参与标准的制定过程并创建类库来提高.Net framework的薄弱之处,比方说电子邮件管理。Ximian应该这样做,欧洲计算机制造协会(ECMA)的C#不是由微软把持的。图1.1.1是 Mono项目的发展蓝图。图1.1.1 Mono项目包括三个核心的部分:一个C#语言的编译器,一个CLI和一个类库。 CLI是包含了类加载器的虚拟机,实时的编译器,和一个运行时环境的垃圾收集器。CLI这个组件将允许用C#编写的应用程序能够在象Linux这样的非 Windows操作系统上运行。这与Java世界中Java虚拟机能够让一个应用程序在不同的操作系统上运行是类似的。C#编译器遵循GPL 许可。CLI遵循LGPL2.0许可(注意时LGPL2.0而不是LGPL2.1),类库遵循更为宽松的MIT X11许可。对于那些代码不遵循GPL和LGPL的作者来说,C#编译器和CLI也可采用私人许可,可以和mono- [email protected]联系。在发布的第一版中,Mono实现了微软 .NET Framework中的大部分类库。但是Windows.Forms等类库还在实现当中。其它一些较小的较少使用的组件,如 System.Management, System.Drawing.Design,还没有Mono的同等实现。Mono 1.0发行版包含下列组件:Ø C#编译器Ø VM(虚拟机),包括即时编译(JIT)和预编译。Ø IL汇编器和反汇编器。Ø 开发和安全工具。Ø 核心类库:mscorlib,System,System.XML。Ø System.Data和Mono的数据提供器。Ø System.Web:Web应用程序平台和Apache嵌入模块。Ø System.Web.Services:客户端和服务器端支持。Ø System.Drawing。Ø System.DirectoryServices。Ø JIT支持:X86,SPARC和PPC架构(一些其它的架构可以支持解释执行)。Ø ECMA profiles: special build options to build Mono as an implementation of the various ECMA profiles will be available.Ø 通过IKVM集成Java。Ø 运行时的嵌入式开发接口。2004年的7月份,微软发布了Whidbey的beta1版,2005年,Whidbey正式版将发布。新版本的.Net Framework包括:Ø 泛型:这个改变影响到了编译器,运行时和类库。Ø ASP.Net 2:很多工具简化了WEB应用开发:Master Pages,分部类型,大量的新控件,个性化和主题等等。Ø Remoting:新的安全频道和版本检测(version-resistant)remoting。Ø XML:XQuery首次出现,作为一个基于XPath的增强型XmlDocument:XPathDcoument。Ø 网络:FTP客户端,SSL数据流。Ø 控制台和串口:控制台终端输入/输入可以进行串口处理。Ø WINFORM:动态布局和各种新的控件。Ø ObjectSpace:一套API可以简化数据库的访问。Mono小组正在平行的开发Whidbey中的一些新特征,这些特性将在Mono1.2中出 现。可以从CVS中下载Mono的最新源代码以了解这些特性的开发情况。这个版本将新增: Ø 泛型支持:C#编译器,可执行系统和核心类库。Ø Asp.Net 2.0增强。Ø Remoting改进。Ø System.Xml:简单的改进,缺少的附件(例如XQuery)。Ø 控制台和串口支持。Ø 新编译器:VB.NET和Jscript支持。Ø WSE1/WSE2实现。Ø System.Windows.Form将正式出现;1.2的API是否可用将作为一个不确定的选项。Ø ObjectSpace:一套API可以简化数据库的访问。 Mono1.2将在2004年的第四季度发布。2005年的第二季度,将发布Mono的1.4版,Mono 1.4将提供上个版本没完成的组件和一些模块的性能提升。使System.Xml,Asp.Net和Windows.Forms符合.Net 1.2编程接口标准。估计微软的Whidbey也差不多在这个时候发布。想比较而言,Mono1.0比微软的.NET Framework 1.0推出了晚1年半。事实上,除了微软的一些类库还正在实现中外,Mono还增加了很多微软未实现的类库,如Gtk#,利用Gtk#,你可以开发跨平台 的界面程序。Mono的Windows.Forms将采用winelib实现。1.3 Mono的意义对于开源社区的人来说,Mono可能不仅仅是一种新奇工具,而是意义重大的进步。它可以让开放源代码社团一统天下平台,包括 Windows、Linux和其它平台;它能提供了一种强有力的移植工具;它还为现有开放源代码技术如Mozilla 和Apache广开生路,更重要的是,最终解决了开放源代码社团与微软对抗的升级战。Mono不是像微软Visual Studio这类开发工具,它的目标是直接将微软开发工具的底层全部移植,这包括微软C#开发语言、类库与微软CLR runtime。Icaza认为复制微软努力的成果(多数已公布给Ecma标准组织)将可让其它操作系统,尤其是Linux,更受开发人员欢迎。有 了.Net的「通用虚拟机器」(universal virtual machine),程序人员将有更多的语言选择空间。在此之前,为了实现方便的移植,开发人员采用Java作为开发语言,但微软可不喜欢Java,他们的 目标是自己的.NET,藉以吸引开发人员。 开放源代码组织对Mono有两种截然相反的观点。 一种观点认为Mono对开放源码运动有害,开放源码阵营对这项消息各有正反面解读 。Mono计划一旦实施后,使用者就可以用C#(或者Mono中任何与CLS兼容的开发语言)撰写应用程序、在Linux(或者任何其它有GNOME类别 库的操作系统)上进行测试、然后用于Linux或者微软平台上。而这正是开放源码支持者所担心的。 另一种观点对开放源码运动有益,但另外有许多开放源码的拥护者则认为这是个绝大的开展机会。首先,他们认为若.NET架构能以GPL为基础,并遵循 ECMA标准的话,微软在考虑扩展标准时便能采取一种与操作系统无关的公正姿态。他们同时也认为这正可搭上C#及.NET类别库培训和支持的庞大市场潮 流。如果Mono计划严格地遵循ECMA标准,那么培训课程、书籍以及各类支持在Windows上执行C#和.NET类别库的相关补充教材都将有助于开放 源码人员在Mono上开发各种系统。看看书店众多的.NET书籍,都可以帮助我们开发Linux下的程序。 持有第二种观点的人越来越多,最显著的一个标志就是。GNU.org也开始了他们的.NET实现,项目名称为Portable.Net,网址是 http://DOTGNU.org。 如今,已经有基于Mono的商业软件出现,Novell目前集中把Mono作为它的开发平台,如iFolder 3.0,它和 Longhorn的WinFS功能有些类似,能够进行数据同步,备份等等工作。一些好事者也将asp.net上的一些例子移植过来。 1.4 Mono架构的一些知识我们将使用一张图简单描述一下我们的应用程序运行时的调用情况。图1.4.1 类库(Class Library)提供了一套丰富的可重用的开发组件,可以被其他语言使用,如C#、VB.net、JScript。类库按命名空间 (Namespaces)组织,发布成共享的程序库,叫做配件(Assemblies)。命名空间就是对元素(类和其它命名空间)按照语义进行分组的一种 简便方式,其目的就是为了避免名称冲突。从理论上说,可以将命名空间嵌套任意层。配件是类库的物理打包方式,也就是类库实际保存的方式,一般为后缀为 dll文件。CLI(Common Language Specification)由Mono可执行程序实现。用以运行编译的.NET程序。 CLS(Common Language Specification)在ECMA-335中定义,它定义了CLI的接口。Mono编译器将产生一个符合CLS的映像(image),这就是通用中 间语言CIL(Common Intermediate Language),Mono运行时读取这个映像并运行它。(完)计算机基础教程网