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/