在近日舉辦的Modern .NET DDD Conference會議上,Chris Hardy在他的演講中展示了如何基于.NET/C#,開發(fā)面向Windows Phone 7,iPhone及Android三個平臺的應(yīng)用程序,以及其中的注意事項(xiàng)。
首先Chris列舉了三個平臺上使用的工具及框架等周邊環(huán)境:
Windows Phone 7 | iPhone(MonoTouch) | Android(MonoDroid預(yù)覽版) | |
操作系統(tǒng) | Windows | Mac | 跨平臺 |
---|---|---|---|
開發(fā)工具 | Visual Studio 2010 | MonoDevelop | VS 2010 / MonoDevelop |
設(shè)計(jì)工具 | Expression Blend 4 | Interface Builder | XML文件/ DroidDraw |
開發(fā)框架 | Silverlight for WP | Silverlight 3的超集 | Silverlight 3的超集 |
社區(qū)情況 | 極好 | 較好 | 尚早 |
MonoTouch是Novell公司推出的基于Mono的iOS應(yīng)用程序開發(fā)套件,并可以將應(yīng)用程序發(fā)布至蘋果應(yīng)用程序商店。Mono是一款基于ECMA標(biāo)準(zhǔn)開發(fā)的.NET運(yùn)行環(huán)境,使用JIT(Just-in-Time)編譯方式來執(zhí)行IL代碼,不過由于iOS設(shè)備的限制,MonoTouch使用了AOT(Ahead-of-Time)編譯方式,直接將原生代碼部署至iOS設(shè)備(iPhone,iPhone 4,iPad)上。
MonoTouch還提供了一個Linker,它會將SDK及程序代碼中真正使用到的部分靜態(tài)鏈接至應(yīng)用程序中,從而削減了應(yīng)用程序的體積。使用MonoTouch開發(fā)出來的應(yīng)用程序可以在iOS設(shè)備上獨(dú)立運(yùn)行,這是因?yàn)镸onoTouch會將一個運(yùn)行時(shí)放入應(yīng)用程序內(nèi)部的原因。據(jù)Chris稱,這會給應(yīng)用程序的體積帶來大約6MB的增長。
使用MonoTouch,.NET/C#程序員可以利用現(xiàn)有的知識進(jìn)行開發(fā),能夠使用反射、泛型、LINQ、Lambda等各種高級的.NET/C#特性。面向原生API的綁定存放在monotouch.dll中的MonoTouch命名空間下,并與CocoaTouch(即用于iOS開發(fā)的原生Objective-C框架)的命名空間映射。
在綁定時(shí),MonoTouch不是一味地直接暴露出Cocoa Touch的功能,而是在一定程度上將它的API改寫為更傾向于.NET程序員的形式。例如UIView的Frame屬性為System.Drawing.RectangleF類型,而不是Cocoa Touch中原本使用的CGRect。對于一些如NSArray這樣的類型,MonoTouch也在合適的地方將其轉(zhuǎn)化為強(qiáng)類型的數(shù)組。在調(diào)試方面,MonoTouch使用了Mono的Soft-Debugger,支持在模擬器、真機(jī),甚至通過WIFI進(jìn)行調(diào)試。
MonoDroid是針對Android系統(tǒng)的應(yīng)用程序開發(fā)套件,大體和MonoTouch相同,目前正處在預(yù)覽發(fā)布階段,只有少量早期預(yù)訂的用戶拿到了SDK。
據(jù)Chris稱,有了MonoTouch和MonoDroid便可以復(fù)用相當(dāng)部分的代碼,包括現(xiàn)有的開源項(xiàng)目,如Json.NET、FlickrNet及XnaTouch。XnaTouch是一款基于MonoTouch的XNA框架實(shí)現(xiàn),簡化XBox及WP7上的游戲向iOS上的移植工作。不過在復(fù)用時(shí)并不能共享二進(jìn)制文件,而必須針對不同的平臺重新編譯代碼。
在UI部分,三個平臺各有原生的解決方案。除了WP7以外,iPhone和Android分別使用MonoTouch及MonoDroid提供的原生API的C#綁定進(jìn)行開發(fā)。例如,MonoTouch進(jìn)行UI開發(fā)時(shí)使用的是iOS標(biāo)準(zhǔn)的應(yīng)用程序的架構(gòu),包括其MVC驅(qū)動方式。開發(fā)人員可以通過Interface Builder編輯XIB文件,MonoTouch會自動根據(jù)XIB的內(nèi)容在局部類中生成C#代碼,所有的outlet,action等元素都會在代碼中得到體現(xiàn)。
Chris也提到了其他一些必須針對平臺編寫特定代碼的地方,例如在文件的存儲上,MonoTouch和MonoDroid可以直接像本地路徑寫入數(shù)據(jù),而在WP7上則必須使用獨(dú)立存儲:
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獲取數(shù)據(jù)時(shí),在MonoTouch及MonoDroid上可以直接調(diào)用DownloadFile相關(guān)方法來下載文件,而在WP7中,則需要使用OpenRead相關(guān)方法處理二進(jìn)制數(shù)據(jù)流。
Chris在演講中演示了一個跨平臺的Twitter應(yīng)用程序的開發(fā)過程,您可以在他的博客上訪問WP 7和MonoDroid的開發(fā)錄像,以及完整的幻燈片內(nèi)容。Chris與他人還合著了一本講解MonoTouch開發(fā)的書籍。