1. Mono 和 CLI 简介
这里先介绍一下Mono项目,Mono是微软 CLI 规范的一种实现,类似的还有 .NET Framwark、Portable.NET(该项目已于2012.12月停止). CLI 是 Common Language Infrastructure(公共语言基础)的缩写,它规定了一语言虚拟机结构规范,这点类似于Java虚拟机,只要遵循该规范编写的代码均可以运行于该虚拟机之上,只要该虚拟机针对各个实现,那么我们编写的代码就可以“一次编写,处处执行”了, Mono就是 CLI 规范的一个跨平台实现。.NET Framwork 虽然也是 CLI 规范的一个实现(.NET Framwork 是一个技术集合,除了实现 CLI 其还包含其他技术),但是它只在Windows上实现了,如果微软愿意它也可以实现跨平台。
图 1 CLI 语言虚拟机
其实理解Mono,可以类比 Java虚拟机。Java虚拟机(该虚拟机最初只为Java打造所以才叫Java虚拟机,跟Java语言应该分开看)就是一个语言虚拟机,它也有自己的一套规范,只要遵循Java虚拟机规范的语言编写的代码都可以跑在Java虚拟机之上, Java 语言就是遵循Java虚拟机规范的一种语言。CLI 一开始就野心比Java虚拟机大,因为它一开始就打算打造一个语言虚拟机平台,上面可以支持各种语言,而不是像Java虚拟机最初只是为了Java设计的,造成Java虚拟机许多地方考虑不周全。
C# 语言是微软发展Java受限后提出的一种现代化编程语言,自然是汲取了前人的经验,就语言本身而言比Java要优秀,只是由于C#并没有微软提供的跨平台虚拟机的支持,所以刚出来那会只能在Windows上使用,而Windows上使用的比较多的是VC++、VB,造成C#语言使用不是很广(当然现在C#已经使用的广泛了,在编程语言排行上保持前五)。
Mono项目的目标就是提供一个符合 CLI 规范的跨平台语言虚拟机实现,让更多的人可以使用C#在Linux、Mac OS等这些系统上编写程序了,获得 C# 和 CLI 所带来的巨大好处。
2. 搭建开发环境
我使用的是Linux发行版本是Ubuntu 11.10
Mono 在Ubuntu 10版本后都是默认安装了的,在 Ubuntu Software Center 中可以搜索"mono"看是否已经安装,如果没有安装可以在 Ubuntu Software Center中搜索并安装。
图 2 Mono in Ubuntu Software Center
我的Ubuntu中已经默认安装好了Mono Runtime,表示上面可以运行基于Mono编写的C#程序了。接下来安装开发工具MonoDevelop(一个类似 Virtual Studio的开发工具),不过这个开发工具也是跨平台的其也有针对 Window 和 Mac OS 的版本。针对各平台的下载网址:http://monodevelop.com/download
开发工具安装完成后基本的开发环境就搭建好了,下面就可以看是 Linux 上的 C# 编程之旅了,啊哈~
3. Hello World
打开 MonoDevelop,对于习惯了双击图标启动应用程序的我,最开始使用连个程序多不会启动,真是丢脸死了 囧。在Ubuntu帮助中心找到了方法,点击桌面左侧栏上的 Dash Home (下图中的Ubuntu图标),在弹出的搜索栏中输入要找的应用程序,找到有单击即可启动。
Mono的搜索和启动
启动后就见到了熟悉的开发界面(是不是很像 VS), File -> New -> Solution 弹出下面对话框(界面看着真是舒服啊~~),MonoDevelop还在不断发展,可能地现在使用的已经进化到比这高级很多了:
图 MonoDevelop 新建解决方案
我们新建一个名为 “MonoTest”的解决方案,项目名为 HelloWorld,之后就是下面的界面了,在Main.cs中打印"Hello World":
图 MonoDevelop 编写 C# 控制台程序
编译和调试与VS类似,有 VS 这么优秀的范例在前面,MonoDevelop为了方便用惯了 VS 的程序员,尽量采用了与 VS相似的界面布局。
图 MonoDevelop 调试
接下来就是运行编译后的程序,这个应该不会有人出错吧~
图 linux上运行 C#编写的控制台程序
前面说过了 Mono 都是 CLI 规范的一个跨平台实现,只要编译后的代码符合 CLI 规范就可以在符合 CLI 规范的虚拟机上运行。我上面的程序都是在Linux平台上编写的使用Mono编译成了符合 CLI 规范的文件(类似于java中的class文件), 如果我将该文件拷贝到 windows 平台下(我的windows上只装了 .NET Framwork 没有装 Mono),由于 .NET Framwork 是一个符合 CLI 规范的虚拟机,因此他可以识别和运行刚才我们在Linux上编写的C#程序,实验结果呢?
图 在window上运行从Linux上拷贝过来的C#程序
哈哈,它真的运行了,看到了吧小伙伴,这就是“一次编写,处处运行”的真实写照啊(使用Java享受跨平台福利已久的小伙伴们勿喷~~),希望Mono越做越好!
4. WinForm 编程
前面是 使用C# 开发Linux上的控制台程序,这个虽说已经可以做很多事了,但是别忘了 C# 开发WinForm程序那可是很爽的,Mono怎么能不实现这一部分呢?Mono当然会实现了啦。下面我们就在Linux 下使用 C# 开发WinForm程序。
在 上面的解决方案中添加新项目,在 弹出的对话框中选择一个 GTK 项目(WinForm是Windows上的技术,Linux上使用GTK等技术实现WinForm)取名"Windows",然后在MainWindow.cs中编写如下代码,其所做的工作就是创建一个名为"OK"的按钮,并添加到该窗体中。除此之外,还为该按钮的鼠标点击事件绑定了相应的处理函数,当点击按钮时弹出一个消息框。
图 Linux上使用 C# 编写基于Mono的WinForm程序
运行程序效果如下:
图 Linux上运行 C# 编写基于Mono的WinForm程序
由于改程序编译成了中间代码,因此该程序也可以直接拷贝到 Windows平台下运行,不过由于是使用Linux上的GTK来实现Windows上的 WinForm 所以在Window上运行时需要安装相应的GTK库或者Mono for windows。
5 小结
这些只是自己出于一时兴趣的尝试,算是给想了解下用C#编写Linux程序或是跨平台程序的小伙伴一个引导吧。个人文笔不好又有点懒,所以贴了这么多图,希望还算凑合。
随着移动平台的崛起,Mono也有Android 和 IOS 的实现版本,因此你也可以使用 C# 来开发 Android 和 IOS 应用程序。
相关链接:
ECMA C# 和 CLI 标准: http://msdn.microsoft.com/en-us/vstudio/aa569283.aspx
Mono for Debian/Ubuntu : http://pkg-mono.alioth.debian.org/