1. 程式人生 > >OS X 上使用.NET開發應用程式

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許可協議釋出。原始碼分為兩部分:monomacmaccore,都可以在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. 下載完軟體,點選執行如圖:

    xcodeimage

    上邊的那幅圖中有xcode和IOS SDK的安裝說明,下面那幅圖是軟體安裝的圖示,點選下邊的Xcode and iOS SDK開始安裝。

    xcodeimage1

    xcodeimage2

    一路繼續就可以了

    xcodeimage4

  3. 下載和安裝 MonoDevelop 2.4, 這是Mono的一個IDE ,是開源和免費的,他要求 Mono 2.4 和 GTK。 Mono安裝過程十分普通,而MonoDevelop的安裝方式對於Windows使用者可能有些特別。在載入了dmg檔案以後,會彈出這樣一個介面:monodevelop根據提示,此時您只需要將MonoDevelop的圖示拖至右側目錄中就可以了。
  4. 下載和安裝 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,所有用到的圖片也是這篇部落格的,我只是按照這篇部落格的內容熟悉了一下開發環境,其中也碰到了一些問題,我會以紅色的文字進行標識,相信也是你體驗的時候會碰到的問題,不過這篇部落格需要FQ才能閱讀,你懂的:

首先需要建立一個MonoMac的工程,我們命名為HelloMonoMac:

6a00d8341c55c153ef0133f425f49e970b-800wi

MonoDevelop是英文的,是因為在中文的Mac系統下,MonoDevelop介面上的中文會亂碼,通過MonoDevelop—〉Preferences –>Visual Style –>General—>User Interface Language 選擇English就可以解決。

建立的專案有下面檔案:

  • info.plist - 一個文字檔案包含應用程式的一些屬性字串,類似於.NET專案的AssemblyInfo.cs,具體參考 reference guide.
  • Main.cs - Main.cs裡包含了專案的啟動程式碼.
  • 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視窗):

interfacebuilder

在Library裡找到NSButton,把它拖到中間的UI 編輯器視窗上,修改“Button”為“點選我”:

interfacebuilder2

下面新增一個NSTextField,方法和NSButton類似,我們要做的一件事就是按下按鈕的時候,修改TextField的文字顯示:

interfacebuilder3

下一步是建立UI和控制器之間的介面,首先是一個更新文字的屬性,然後是通過一個事件 控制按鈕的點選,控制器來我們使用C#程式碼進行編寫。到Library找到MainWindowController

並在下方下拉框中選取Outlets,並使用下方加號新增一個id,修改為NSTextField:

interfacebuilder4

下一步是建立label和NSTextField之間的對映,這是個比較有趣的操作。回到MainWindow.xib視窗,選中“File’s owner”,在屬性視窗中選擇第五個,一個向右的箭頭按鈕。再將label右側的小圓點拖動至NSTextField,當你釋放滑鼠你要看你NSTextField標籤所聯絡在一起:

interfacebuilder5

快完成了。下一步是在Interface builder建立一個按鈕點選事件。 到Library的視窗。確定它仍然顯示MainWindowController。選取Action。點選“+”和增加buttonClicked 型別為 NSButton。在屬性視窗中,您應該看到一個新收到行動稱為buttonClicked。把它和在畫布上的按鈕按照標籤相同的方法建立關聯。

interfacebuilder6

最後一步是儲存我們的介面修改結果,這一步很重要哦,因為MonoDevelop是根據xib的內容,自動生成了相關的C#程式碼。

現在我們回到MonoDevelop專案中,將下面的程式碼加入到MainWindow.Controller.cs檔案。關鍵是新增一個方法——buttonClicked,也需要NSButton。程式就會按鈕點選的時候觸發請求該這個方法:

int count = 0;  
partial void buttonClicked(NSButton sender)  
{  
 label.StringValue = string.Format("Button clicked {0} times.", ++count);  
} 

此時可以選擇選單Run - Run,或直接使用快捷鍵Command(即Win鍵) + Alt + Enter便會編譯專案,這樣你就可以看到這個程式執行起來了。