Mono向Mac OS應用程序開發示好

作者: Jeffrey Zhao  來源: infoq  發布時間: 2010-11-05 13:59  閱讀: 2017 次  推薦: 0   原文鏈接   [收藏]  

Mono正在努力改進各個平臺上的使用體驗。近日Miguel de Icaza在博客上宣布MonoMac發布了新的版本MonoMac是面向Mac OSX API的C#綁定,其API設計主要受到了MonoTouch的啟發,后者可以基于Mono開發原生的iOS應用程序。MonoMac套件的目標之一,也是發布獨立的.app應用程序,讓最終用戶擺脫對Mono的依賴。

多年以前,Geoff Norton創建了CocoaSharp,這是第一套面向Cocoa API的.NET綁定。從那時起,Mono用戶開始嘗試利用.NET客戶端調用Objective-C的API。幾年下來,也出現了其他幾個設法集成Objective-C和.NET語言的框架,它們各有利弊。一年多前Mono希望可以將這些競爭對手結合起來,可惜最后無疾而終。

之后MonoTouch的成功則是一個良好的基礎,于是Mono開始將Cocoa API使用C#和.NET世界中的模式與慣例用法表現出來,并提供開發人員整套Cocoa應用程序的開發工具。在設計方面,MonoMac參考了《Framework Design Guidelines》一書中總結出的設計決策及建議,主要包括:

  • 減少意外
  • 基于C#及其他.NET類庫
  • 降低出錯的可能
  • 增加開發樂趣
  • 提高生產力,節省開發人員時間
  • 利用一切.NET方面的知識

Miguel表示,.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綁定生成器。btouch綁定生成器接受C#語言形式的API約定,自動生成一個綁定,例如MSActionCell:

 
[BaseType (typeof (NSCell))]
interface NSActionCell {
[Export (
"initTextCell:")]
IntPtr Constructor (
string aString);

[Export (
"initImageCell:")]
IntPtr Constructor (NSImage image);

[Export (
"target")]
NSObject Target { get; set; }

[Export (
"action")]
Selector Action { get; set; }

[Export (
"tag")]
int Tag { get; set; }
}

 

由于生成Objective-C API有大量重復工作,MonoMac還提供了一個頭文件解析工具,可以從Objective-C的頭文件中生成絕大部分的API。不過對于某些生成的結果還需要進行一些修改才能滿足設計的要求,例如,NSArray的參數和返回值需要根據文檔修改為合適的強類型。

MonoMac還沒有覆蓋完整的Cocoa API,不過已經基本可以用于創建API,并已經開放接納社區的貢獻。目前的綁定有:

  • AddressBook(完成)
  • AudioToolbox(完成)
  • AppKit(90%完成)
  • CoreAnimation(完成)
  • CoreFoundation(已完成設計原則中需要的部分)
  • CoreText(完成)
  • CoreLocation(完成)
  • CoreData(完成)
  • CoreGraphics(完成)
  • Foundation(已完成設計原則中需要的部分,包括其他部分的輔助工具)
  • WebKit(缺少DOM代碼)

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共用的代碼。如果您對OS X下的.NET開發及MonoMac感興趣,可以參考這篇開發向導

另一方面,最近Logos Bible Software的技術領導人David Mitchell在Mono郵件列表上表示,他們基于Mono,將原本為Windows平臺開發的軟件移植到了Mac平臺上,兩者共享了絕大部分代碼,唯一不同的只是UI方面從WPF變成了OS X的原生界面。不過與MonoMac的做法不同,Logos Bible Software的做法是在Objective-C編寫的UI界面中調用.NET代碼。

0
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()