編者按:在Windows Phone 7發布之後,移動開發領域除iPhone和Android之外季軍即
將明朗,越來越多的開發人員開始向Windows Phone
7平台轉移。本文為著名開發人員趙劼為InfoQ撰寫的一篇文章,詳實記錄了在近日舉辦的Modern .NET DDD
Conference會議上,著名開發人員Chris Hardy在他的演講中展示了如何基於.NET/C#,開發面向Windows Phone
7,iPhone及Android三個平台的應用程式,以及其中的注意事項。
首先Chris列舉了三個平台上使用的工具及架構等周邊環境:
|
Windows Phone 7 |
iPhone(MonoTouch) |
Android(MonoDroid預覽版) |
作業系統 |
Windows |
Mac |
跨平台 |
開發工具 |
Visual Studio 2010 |
MonoDevelop |
VS 2010 / MonoDevelop |
設計工具 |
Expression Blend 4 |
Interface Builder |
XML檔案 / DroidDraw |
開發架構 |
Silverlight for WP |
Silverlight 3的超集 |
Silverlight 3的超集 |
社區情況 |
極好 |
較好 |
尚早 |
iPhone VS Windows Phone 7 VS Android
MonoTouch是Novell公司推出的基於Mono的iPhone
OS應用程式開發套件,並可以將應用程式發布至蘋果應用程式商店。Mono是一款基於ECMA標準開發的.NET運行環境,使用JIT(Just-in-
Time)編譯方式來執行IL代碼,不過由於iPhone
OS裝置的限制,MonoTouch使用了AOT(Ahead-of-Time)編譯方式,直接將原生代碼部署至iPhone
OS裝置(iPhone,iPhone
4,iPad)上。MonoTouch還提供了一個Linker,它會將SDK及程式碼中真正使用到的部分靜態連結至應用程式中,從而削減了應用程式的
體積。使用MonoTouch開發出來的應用程式可以在iPhone
OS裝置上獨立運行,這是因為MonoTouch會將一個運行時放入應用程式內部的原因。據Chris稱,這會給應用程式的體積帶來大約6MB的增長。
使用MonoTouch,.NET/C#程式員可以利用現有的知識進行開發,能夠使用反射、泛型、LINQ、Lambda等各種進階的.NET
/C#特性。面向原生API的綁定存放在monotouch.dll中的MonoTouch命名空間下,並與CocoaTouch(即用於iPhone
OS開發的原生Objective-C架構)的命名空間映射。在綁定時,MonoTouch不是一味地直接暴露出Cocoa
Touch的功能,而是在一定程度上將它的API改寫為更傾向於.NET程式員的形式。例如UIView的Frame屬性為
System.Drawing.RectangleF類型,而不是Cocoa
Touch中原本使用的CGRect。對於一些如NSArray這樣的類型,MonoTouch也在合適的地方將其轉化為強型別的數組。在調試方
面,MonoTouch使用了Mono的Soft-Debugger,支援在模擬器、真機,甚至通過WIFI進行調試。
MonoDroid是針對Android系統的應用程式開發套件,大體和MonoTouch相同,目前正處在預覽發布階段,只有少量早期預訂的使用者拿到了SDK。
據Chris稱,有了MonoTouch和MonoDroid便可以複用相當部分的代碼,包括現有的開源項目,如Json.NET、
FlickrNet及XnaTouch。XnaTouch是一款基於MonoTouch的XNA架構實現,簡化XBox及Windows Phone
7上的遊戲向iPhone OS上的移植工作。不過在複用時並不能共用二進位檔案,而必須針對不同的平台重新編譯代碼。
在UI部分,三個平台各有原生的解決方案。除了Windows Phone
7以外,iPhone和Android分別使用MonoTouch及MonoDroid提供的原生API的C#綁定進行開發。例如,MonoTouch進
行UI開發時使用的是iPhone OS標準的應用程式的架構,包括其MVC驅動方式。開發人員可以通過Interface
Builder編輯XIB檔案,MonoTouch會自動根據XIB的內容在局部類中產生C#代碼,所有的outlet,action等元素都會在代碼中
得到體現。
Chris也提到了其他一些必須針對平台編寫特定代碼的地方,例如在檔案的儲存上,MonoTouch和MonoDroid可以直接像本地路徑寫入資料,而在Windows Phone 7上則必須使用隔離儲存區 (Isolated Storage):
- void SaveLocal(string data)
- {
- #if (MonoTouch || MonoDroid)
- File.WriteAllText(_localPath, data);
- #elif WINDOWS_PHONE
- using (var appStorage =
- IsolatedStorageFile.GetUserStoreForApplication())
- {
- var file = appStorage.OpenFile(_localPath, FileMode.Create);
- FileExtension.WriteAllText(file, data);
- }
- #endif
- }
-
同理,使用WebClient擷取資料時,在MonoTouch及MonoDroid上可以直接調用DownloadFile相關方法來下載檔案,而在Windows Phone 7中,則需要使用OpenRead相關方法處理位元據流。