Windows Phone7中的IronRuby

作者:马宁

示例代码下载见附件。

写这篇BLOG完全是因为看了MSDN上的这篇文章:

http://msdn.microsoft.com/en-us/magazine/ff960707.aspx

    Windows Phone 7的开发工具不支持动态语言,所以IronRuby支持Windows Phone 7就显得格外重要了。刚看这篇文章的时候,还闹了个笑话,看了一遍代码,一句都不认识,心想难道语言换到.NET上,变化怎么这么大?仔细一看,原来是Ruby,而不是Python ^_^,小蟒蛇这次落后了。以前用Python写过自动化测试脚本,没接触过Ruby,所以,把Ruby看成Python了。

    不支持动态语言,一直是Windows Mobile编程的痛,这次终于有搞头了。终于可以动态改变程序的逻辑了,光这一点就给我们提供了无限的想象空间。Windows Phone上的F#也快了吧?^_^

    言归正传,这次我完全是照葫芦画瓢,只是将自己尝试中的一些关键点写出来,让大家少走弯路。更多信息大家可以参考Shay Friedman的BLOG:http://ironshay.com/

    首先,我们要下载IronRuby for Windows Phone版本(.NET 3.5):

http://ironruby.codeplex.com/releases/view/43540#DownloadId=133276

    然后,在Visual Studio 2010中创建一个Silverlight for Windows Phone 7的工程,工程名叫做“IronRubyWP7”,然后选择“Project”菜单的“Add Reference”选项,在弹出的对话框中,选择“Browse”标签,我们可以找到解压后的IronRuby目录,将\silverlight\bin中的DLL文件加入到工程中来:

    在忽略一些警告提示之后,程序集将被加入到工程中。我们可以在Solution Explorer中看到刚被加入的程序集:

    接下来,我们在工程中添加一个文本文件,在Solution Explorer中选中IronRubyWP7,右键,“Add”-“New Item”,在对话框中选择“Text File”,将文件名改为“MainPage.rb”。

    选中MainPage.rb文件,在属性中将“Build Action”设置为“Embedded Resource”。

    我们打开MainPage.rb文件,输入下面的Ruby代码:

  
  
  
  
  1. # Include namespaces for ease of use  
  2. include System::Windows::Media  
  3. include System::Windows::Controls  
  4. # Set the titles  
  5. Phone.find_name("ApplicationTitle").text = "aawolf.cnblogs.com" 
  6. Phone.find_name("PageTitle").text = "IronRuby& WP7" 
  7. # Create a new text block  
  8. textBlock = TextBlock.new 
  9. textBlock.text = "IronRuby is running on Windows Phone 7!" 
  10. textBlock.foreground = SolidColorBrush.new(Colors.Green)  
  11. textBlock.font_size = 48  
  12. textBlock.text_wrapping = System::Windows::TextWrapping.Wrap  
  13. # Add the text block to the page  
  14. Phone.find_name("ContentPanel").children.add(textBlock) 

    请注意,我修改了最后一行的容器控件名称,原示例中的名称是“ContentGrid”,但是Silverlight for Windows Phone向导默认创建的XAML文件中容器类名称是“ContentPanel”。这里会引起一个运行期错误,因为IronRuby不能Debug,所以第一次调试起来比较痛苦。

    接下来,我们要打开MainPage.xaml.cs文件,将IronRuby初始化代码,加入到MainPage类的构造函数中:

  
  
  
  
  1. public partial class MainPage : PhoneApplicationPage  
  2.     {  
  3.         // Constructor  
  4.         public MainPage()  
  5.         {  
  6.             InitializeComponent();  
  7.             // Allow both portrait and landscape orientations  
  8.             SupportedOrientations = SupportedPageOrientation.PortraitOrLandscape;  
  9.             // Create an IronRuby engine and prevent compilation  
  10.             ScriptEngine engine = Ruby.CreateEngine();  
  11.             // Load the System.Windows.Media assembly to the IronRuby context  
  12.             engine.Runtime.LoadAssembly(typeof(Color).Assembly);  
  13.             // Add a global constant named Phone, which will allow access to this class 
  14.             engine.Runtime.Globals.SetVariable("Phone", this);  
  15.             // Read the IronRuby code  
  16.             Assembly execAssembly = Assembly.GetExecutingAssembly();  
  17.             Stream codeFile =  
  18.               execAssembly.GetManifestResourceStream("IronRubyWP7.MainPage.rb");  
  19.             string code = new StreamReader(codeFile).ReadToEnd();  
  20.             // Execute the IronRuby code  
  21.             engine.Execute(code);  
  22.         }  
  23.     } 

    请大家注意InitializeComponent方法的位置,在初始化IronRuby运行时之前,一定要先完成控件初始化的工作,这是我血和泪的教训。另外一个需要注意的地方,就是读取Ruby文件的路径。我们似乎也可以通过HttpRequest获取一个Stream是吧?笑而不语 ^_^

    最后运行的效果是这样子的,整个开发过程历时两小时:

相关资源

马宁的Windows Phone 7开发教程(1)——Windows Phone开发工具初体验

马宁的Windows Phone 7开发教程(2)——Windows Phone XNA 4.0 3D游戏开发

马宁的Windows Phone 7开发教程(3)——XNA下使用MessageBox和软键盘

马宁的Windows Phone 7开发教程(4)——XNA显示中文字体

你可能感兴趣的:(windows,windows,开发,测试,mobile,phone7,IronRuby)