OS X 上使用.NET開發應用程序
MonoMac是面向Mac OSX API的C#綁定,其API設計主要受到了MonoTouch的啟發,后者可以基于Mono開發原生的iOS應用程序。MonoMac套件的目標之一,也是發布獨立的 .app應用程序,讓最終用戶擺脫對Mono的依賴。MonoTouch的成功則是一個良好的基礎,于是Mono開始將Cocoa API使用C#和.NET世界中的模式與慣例用法表現出來,并提供開發人員整套Cocoa應用程序的開發工具。
Mono之父Miguel de Icaza表示,.NET從一開始便設計成為一個易于互操作的框架,他對于跨運行時及框架的無縫通信提供了許多高級的支持,這對創建Cocoa API的綁定很有幫助。MonoMac的設計原則與MonoTouch非常接近,它充分考慮到.NET程序員的習慣需求,例如使用Lambda表達式和委托來表示Objective-C API中的“block”。
Cocoa的API由兩部分組成,一部分是基于C的API,例如AudioToolbox、CoreGraphics、CoreFundation和CoreText,它們利用P/Invoke的方式直接封裝成C#類。而在UI層面上則是大量的Objective-C編寫的API,例如Foundation和AppKit。MonoMac提供了新的一套新的綁定引擎MonoMac.ObjCRuntime,以及btouch綁定生成器。
MonoMac僅僅是一套用于開發OSX應用程序的類庫。MonoMac團隊同樣發布了一套基于MonoDevelop的開發工具,其生成結果便是Mac OS下的app應用程序包。此外,Mono 2.8還包含了一個新工具叫做“Mono打包器(bundler)”。這個打包器可以檢查你的.NET應用程序,并將其依賴的部分打包在一起。這個技術如今已經用于OSX版本的Banshee項目(一款基于Mono和Gtk#的播放器),這樣發布后的應用程序無需在目標機器裝有Mono框架。
MonoMac使用MIT X11許可協議發布。源碼分為兩部分:monomac和maccore,都可以在GitHub上獲得。前者包含了面向MacOS的綁定,而后者則包含了MonoMac和MonoTouch共用的代碼。
看完上面這段介紹,聰明的你知道主角是MonoMac了,下面我向大家介紹下開發環境的搭建和第一個Helloworld程序的開發:
第一步:需要有一臺Mac 電腦,可以采用虛擬機搭一個也行,為了更好的操作體驗還是準備一臺Mac的機器比較好,2011年1月14日蘋果優惠打折,毫不猶豫的就在香港apple商店上下單買回來一個MacBook Air(CPU:1.86 GHz Intel Core 2 Duo, 4GB RAM,128G SSD),價格10000HK$。
第二步:Mac開發環境Xcode和Monodevelop的安裝,當然在安裝mac系統時,如果選擇IT用戶,很多開發系統也就自動安裝好了,比如jdk、maven、svn,python的環境, 然而不是所有的軟件開發環境都會安裝好,比如xcode 、ios sdk 。
1、到Apple's developer program,選擇 Mac 和iOS 開發,登陸后就可以下載Mac開發工具,里面包括Xcode,這個工具是免費的,這點比微軟的政策好啊,就是要善待開發者。Xcode的環境和 Visual Studio 非常的相像,有Visual Studio的使用經驗非常容易入門.。
下載完軟件,點擊運行如圖:
2、上邊的那幅圖中有xcode和IOS SDK的安裝說明,下面那幅圖是軟件安裝的圖標,點擊下邊的Xcode and iOS SDK開始安裝。
3、一路繼續就可以了
4、下載和安裝 MonoDevelop 2.4, 這是Mono的一個IDE ,是開源和免費的,他要求 Mono 2.4 和 GTK。 Mono安裝過程十分普通,而MonoDevelop的安裝方式對于Windows用戶可能有些特別。在加載了dmg文件以后,會彈出這樣一個界面:
- 根據提示,此時您只需要將MonoDevelop的圖標拖至右側目錄中就可以了。
- 下載和安裝 MonoMac。 MonoMac的插件安裝參考http://www.mono-project.com/MonoMac#Obtaining_MonoMac也很簡單。安裝完MonoMac的插件,在MonoDevelop的新建項目的對話框上就有了MonoMac的項目類型。
下面我們就用MonoDevelop和Xcode一起使用來完成第一個Mac Helloworld程序的開發,下面的內容主要基于這篇博客http://www.satter.org/2010/09/net-development-for-os-x.html,所有用到的圖片也是這篇博客的,我只是按照這篇博客的內容熟悉了一下開發環境,其中也碰到了一些問題,我會以紅色的文字進行標識,相信也是你體驗的時候會碰到的問題,不過這篇博客需要翻墻才能閱讀,你懂的:
首先需要創建一個MonoMac的工程,我們命名為HelloMonoMac:
MonoDevelop是英文的,是因為在中文的Mac系統下,MonoDevelop界面上的中文會亂碼,通過MonoDevelop—〉Preferences –>Visual Style –>General—>User Interface Language 選擇English就可以解決。
創建的項目有下面文件:
- info.plist - 一個文本文件包含應用程序的一些屬性字符串,類似于.NET項目的AssemblyInfo.cs,具體參考 reference guide.
- Main.cs - Main.cs里包含了項目的啟動代碼.
- MainMenu.xib - 菜單資源和代碼文件. 具體參考Interface Builder User Guide
- MainWindow.xib - 主窗口的界面文件,具體參考Interface Builder User Guide 而MainWindow.xib.designer.cs文件則是MonoDevelop根據xib文件中的標記所自動創建的C#代碼,在絕大部分情況下我們不會去修改它。
MonoMac使用Xcode的模式構建UI應用,Xcode使用MVC模型。XIB文件中包含UI和你的代碼,也就是View。你的控制器和模型用.NET來寫,也就是你必須使用Xcode來構建UI,因此必須安裝Xcode。
使用Interface Builder進行界面的布局,在MonoDevelop的項目上雙擊MainWindow.xib文件,便會打開Interface Builder。我的使用過程中卻發生這樣的一件事,無論怎么雙擊也打不開Interface Builder,開始以為是MonoDevelop的問題,就使用Xcode創建一個項目,也是一樣的問題,最后是通過下面的方法解決的:通過Finder找到Developer\Applications\Interface Builder 先運行Interface Builder,就可以了。
下圖有4個窗口,左為Library窗口(近似于VS中的Toolbox),可以通過拖拽方式將控件加入到窗口里去;中間上方是可視化的UI編輯器,下方則是對象管理器,顯示了界面中定義的對象;右側便是用來修改屬性的Inspector窗口(近似于VS中的Properties窗口):
在Library里找到NSButton,把它拖到中間的UI 編輯器窗口上,修改“Button”為“點擊我”:
下面添加一個NSTextField,方法和NSButton類似,我們要做的一件事就是按下按鈕的時候,修改TextField的文本顯示:
下一步是建立UI和控制器之間的接口,首先是一個更新文本的屬性,然后是通過一個事件 控制按鈕的點擊,控制器來我們使用C#代碼進行編寫。到Library找到MainWindowController
并在下方下拉框中選取Outlets,并使用下方加號添加一個id,修改為NSTextField:
下一步是建立label和NSTextField之間的映射,這是個比較有趣的操作。回到MainWindow.xib窗口,選中“File’s owner”,在屬性窗口中選擇第五個,一個向右的箭頭按鈕。再將label右側的小圓點拖動至NSTextField,當你釋放鼠標你要看你NSTextField標簽所聯系在一起:
快完成了。下一步是在Interface builder建立一個按鈕點擊事件。 到Library的窗口。確定它仍然顯示MainWindowController。選取Action。點擊“+”和增加buttonClicked 類型為 NSButton。在屬性窗口中,您應該看到一個新收到行動稱為buttonClicked。把它和在畫布上的按鈕按照標簽相同的方法建立關聯。
最后一步是保存我們的界面修改結果,這一步很重要哦,因為MonoDevelop是根據xib的內容,自動生成了相關的C#代碼。
現在我們回到MonoDevelop項目中,將下面的代碼加入到MainWindow.Controller.cs文件。關鍵是添加一個方法——buttonClicked,也需要NSButton。程序就會按鈕點擊的時候觸發請求該這個方法:
partial void buttonClicked(NSButton sender)
{
label.StringValue = string.Format("Button clicked {0} times.", ++count);
}
此時可以選擇菜單Run - Run,或直接使用快捷鍵Command(即Win鍵) + Alt + Enter便會編譯項目,這樣你就可以看到這個程序運行起來了。