使用IronRuby開發(fā)Windows Phone 7應用程序
原創(chuàng)【51CTO譯文】微軟發(fā)布Windows Phone 7平臺后,Windows Phone發(fā)展并不是非常迅速,但是諾基亞牽手微軟后使更多開發(fā)者看到了Windows Phone 7平臺的潛力,51CTO也歇盡全力為不同語言的開發(fā)者打造一個開發(fā)Windows Phone應用的平臺。前不久51CTO給大家奉獻過《寫給Android開發(fā)者的Windows Phone開發(fā)秘籍》,本文我們將為大家講解一個外國開發(fā)者賈斯汀 詹姆斯(Justin James)如何使用IronRuby開發(fā)Windows Phone 7應用程序,在未來51CTO將為大家講述解不同語言開發(fā)Windows Phone 7應用的實例。
以下為全部譯文:
數(shù)周前,筆者在微軟贊助的一個比賽中免費獲得了一部三星Focus手機,激起了筆者開發(fā)一個Windows Phone 7應用程序的欲望,由于筆者最近在研究IronRuby,因此也想嘗試一下用IronRuby開發(fā)Windows Phone 7應用程序,因此有了Lifting Calculator這款程序。
下載IronRuby
筆者的電腦上安裝了IronRuby 1.1.1,但筆者更熟悉IronRuby 1.1.2,并且它包括了Windows Phone 7支持,因此筆者下載了二進制包(MSI版本不友好)。
使用IronRuby編寫一個Windows Phone 7應用程序
筆者曾拜讀過Shay Friedman發(fā)表在MSDN上一篇題為“Windows Phone 7上的IronRuby”的文章,筆者調(diào)整了他的方向以滿足筆者的需要,一方面是因為筆者已經(jīng)完成了一部分功能,另一方面,筆者想嘗試一下如何使用IronRuby,此外,那篇文章給出的說明不是完全正確。
下面是筆者采取的步驟:
◆添加IronRuby包的引用,筆者從目錄中添加了所有Windows Phone 7二進制包。
◆準備XAML,添加需要的代碼(筆者還沒有使用MVVM)。
◆在調(diào)用Ruby的C#代碼中,筆者添加了下面的Using語句:
- using System.Reflection;
- using System.IO;
- using Microsoft.Scripting.Hosting;
- using IronRuby;
◆創(chuàng)建Ruby文件,包含需要的函數(shù),Ruby腳本應該操作通過Silverlight主機傳遞的全局變量,然后返回一個輸出值。
◆筆者將生成操作設置為將新Ruby文件復制到輸出目錄。
◆添加調(diào)用IronRuby腳本的代碼,通過一個變量接收它的輸出。
詳細信息請查看示例代碼A(調(diào)用IronRuby腳本的C#代碼)和B(IronRuby腳本)。
在Shay的文章中,他將整個應用程序傳遞給了腳本,相反,筆者只傳遞了表示輸入?yún)?shù)的對象和容納輸出的對象,運行這個腳本時,將輸出信息顯示在屏幕上。
示例代碼A:調(diào)用IronRuby腳本的C#代碼
- private void ShowBarbellLoadout(int barbellWeight, int desiredLoad) {
- var resourceStream = Application.GetResourceStream(new Uri("BarbellLoader.rb", UriKind.Relative));
- var dataFile = new StreamReader(resourceStream.Stream);
- var code = dataFile.ReadToEnd();
- var engine = Ruby.CreateEngine();
- engine.Runtime.Globals.SetVariable("BarbellWeight", barbellWeight);
- engine.Runtime.Globals.SetVariable("DesiredLoad", desiredLoad);
- var loadoutResults = (IronRuby.Builtins.Hash)engine.Execute(code);
- var results = new List<BarbellLoadout> { {new BarbellLoadout{ PlateSize = 45, PlateCount = int.Parse(loadoutResults["45"].ToString()) }}, {new BarbellLoadout{ PlateSize = 25, PlateCount = int.Parse(loadoutResults["25"].ToString()) }}, {new BarbellLoadout{ PlateSize = 10, PlateCount = int.Parse(loadoutResults["10"].ToString()) }}, {new BarbellLoadout{ PlateSize = 5, PlateCount = int.Parse(loadoutResults["5"].ToString()) }}, {new BarbellLoadout{ PlateSize = 2.5M, PlateCount = int.Parse(loadoutResults["2.5"].ToString()) }} };
- loadingChart.ItemsSource = results;
- mainPivotControl.SelectedItem = barbellLoading;
- }
示例代碼B:IronRuby腳本
- currentTotal = DesiredLoad.to_i - BarbellWeight.to_i output = {}
- output["45"] = (currentTotal / 90).truncate
- currentTotal -= output["45"] * 90
- output["25"] = (currentTotal / 50).truncate
- currentTotal -= output["25"] * 50 output["10"] = (currentTotal / 20).truncate
- currentTotal -= output["10"] * 20 output["5"] = (currentTotal / 10).truncate
- currentTotal -= output["5"] * 10 output["2.5"] = (currentTotal / 5).truncate
- currentTotal -= output["2.5"] * 5 return output
筆者學到了一個非常重要的教訓:外部全局變量設置必須使用大寫名稱,否則變量將不起作用。更令人沮喪的是,在筆者的腳本中,全局變量名稱前有一個美元符號前綴,這樣做本身并沒有錯,變量也會初始化,但卻沒有輸出,筆者在這個上面花了大量時間才解決問題。
另一個可替換的技術(shù)是使用C# 4中的dynamic函數(shù),例如,Ruby腳本可以創(chuàng)建類,你可以使用dynamic實例化它們,從C#運行它們的方法,筆者沒有直接嘗試這個方法,在純C#代碼中它可以工作,筆者相信調(diào)用IronRuby代碼時也可以。
小結(jié)
這個新方法不是非常實用,除非你喜歡Ruby或有意深挖它的功能,最大的問題是在托管DLR環(huán)境中缺少調(diào)試選項,你不能單步執(zhí)行Ruby代碼,筆者的調(diào)試方法是,將它們復制到別的IronRuby項目,設置全局變量,復現(xiàn)C#代碼設置,以便筆者單步執(zhí)行代碼,對Ruby高手來說,這是小菜一碟,但對于新手而言,難度可不小。盡管如此,在Windows Phone 7應用程序中使用IronRuby仍然有趣。
如果你想在Windows Phone 7上更多地使用IronRuby,推薦下載iron7,一款適合WP7的 Ruby解釋程序。
【51CTO譯稿,非經(jīng)授權(quán)謝絕轉(zhuǎn)載,合作媒體轉(zhuǎn)載請注明原文出處、作者及51CTO譯稿和譯者!】
原文出處
原文名:Use IronRuby to develop a Windows Phone 7 app
作者:Justin James
小貼士:“IronRuby”--即Ruby語言的一個.NET版本,它基于Dynamic Language Runtime (DLR)構(gòu)建,可以用來開發(fā).net應用程序。
【編輯推薦】