在Mono平臺開發前你應該知道
在Mono平臺開發前應該做的第一個事情就是,調整好心情,降低期望值:
對于Linux本地C程序員而言,由于習慣了瘋狂和有魔力的本地C程序員開發,因此對于Mono提供的諸多限制可能不太滿意。大體而言,Mono和.Net程序一樣,屬于框架開發的范疇,對于框架開發,最好在框架規定的范圍內工作,否則會陷入孤立無緣的境地。Mono沒有C開發那些唾手可得的工具,也不能對系統進行無限的挖掘,Mono關注的是應用軟件開發,不是系統軟件(Mono 可以支持本地服務開發)。Mono支持兩重類型軟件開發,以WEB為中心的軟件和以本地為中心的開發。WEB包括常規以上的應用型網站開發,也包括基于服務的模型開發。由于服務現在成為軟件開發的中心并且迅速進化。作為.Net替代平臺,Mono顯得很混亂,主要因為.Net以服務為中心的設計在Mono 上還無法完全施展,因為Mono基礎平臺正處于2.x階段,等09年底應該是一個新階段。對于本地程序開發,主要包括一GTK#和System.Windows為中心的圖形界面程序開發,還包括服務軟件的開發(linux service機構),也包括一Lucene.Net為基礎的搜索軟件的開發。
對于Windows .Net 程序員而言,首先要極度降低期望值,Mono沒有絢麗的工具,缺乏足夠的第三方軟件,并且工具之間的集成也做得不太好,代碼編寫可能不很流暢,MonoDevelop也可能讓你很失望,這些都是Windows上廉價的.Net開發工具把我們慣壞了。Windows.Net程序員來到Mono的主要原因有很多,可能是因為好奇,希望遷移自己的程序,想窺探一下Mono實現以確定和自己想的差距有多遠,更多的是要學習。就像把孩子放到艱苦的地方鍛煉一樣,來到Mono,你將會有同樣的感覺,非常的貧瘠。Mono工具還比較原始,文檔也比較少,我覺得這反倒是學習的好地方,每一次當我打開MSDN,我都會望書驚嘆,多么希望積累足夠豐富的Windows知識呀,但是MSDN讓人感到很大很茫然,最后,還是購買專著研究更合適,其他要用的,用的時候再查資料吧。在Mono平臺上資料非常少,這也是優勢,對于C#語言本身而言,那是學習的好地方,就像C++一樣,C#本身是一個迷人的語言值得研讀一下,但是C#上緊緊捆綁的應用更適合生產而不是學習,如果要學習,需要找一個單調一點、產品單一的環境,當然學好了趕緊回來,趕緊擁抱Windows:)
了解平臺之間的差距:
關于文件系統,Linux基于虛擬文件系統,這是Linux最成功的設計之一,表面看起來就是,任何文件和資源都可以通過一"/"開始的文件來訪問,文件之間的分割符是"/"。在Windows中,文件系統經過多次抽象,看起來類似與以“C:”、“D:”這樣的方式開始,并且文件之間的分隔符使用"\",這是很多程序不可移植的重要原因,可以參考后來的文章,了解如何提高程序的可移植性。
第二個差距就是換行符的不同,在Windows平臺,一個換行符意味著“\r\n",由于在字符終端時代,"\n"的任務是使光標處于下一行的同等位置,而"\r"則是使光標處于一行的開頭,因此,去下一行開始則意味著要配合使用兩個控制符;在Unix族平臺,換行符則使用"\n"表示,這是歷史原因,我猜想是由于早期的時候終端程序的規定導致的。
關于Unicode,這現在應該不成問題了,現在Linux都在內部使用了Unicode,以前Linux在內部使用ASCII編碼及其擴展。由于Windows在內部使用Unicode已經很長時間了,.Net 的Unicode 支持非常好,Char字符本省就是Unicode的,并且System.Text也為文本處理提供了諸多支持。雖然Mono實現了.Net的功能,但是我發現,系統對Unicode 的處理不夠細心,一個細心設計的類庫和平臺,應該保證在大部分情況下系統的反應能和程序員預期的一樣好,但是Mono沒有做到,那是以前的事情了,由于Mono RunTime在一直改進,現在應該有大幅進步吧。文本處理一直都是計算機科學的基本問題之一,通常情況下,處理多國編碼的最簡的辦法是使用UTF-8,由于歷史原因,許多接口并沒有使用UTF-8,而是使用蹩腳的轉換。在Windows下,在.Net出現之前,文本處理一直很讓人頭疼,贊揚.Net事常提的一個問題就是:“難道你還想執行字符串轉換工作?”,看看char *、wchar_t*、_bstr_t、CComBSTR、CString、basic_string 和System.String,往事不堪回首呀,如果不跨庫,不夸方案,那么字符串處理還算輕松,一旦要跨庫跨平臺跨方案,那么,字符串處理就是程序員的噩夢。
結構差距,Microsoft.Net 是一個旨在建立巨大生態圈的大方案,希望面面俱到。因為Microsoft企業平臺架構,Microsoft.Net能夠更好的跟Windows的業務核心和系統核心無縫集成。在Microsoft.Net上,架構師、設計師和程序員看到的不僅僅是.Net,還包括大量運行的關系業務前途的企業服務和組建。在Mono上,由于需要依賴第三方實現,依賴大量的綁定來使用系統或其他軟件的功能,有時侯透明度不夠。沒有MMC、域、MSMQ、WMI、事務支持、服務架構、數據庫服務等重要基礎結構的支持,這些在開發早期就應該確定的因素,請確定Mono能夠滿足你的要求。另一方面,這些在很多時候也是一個優勢,有大量的第三方組建在實現這些功能,包括Apache和Mozilla和Postgrsql。