微软MVP推荐:WP7上的IronRuby开发

移动开发
本文的作者是一位微软Visual C#/IronRuby MVP,也是《IronRuby Unleashed》一书的作者。他向我们推荐了一种无论对于.NET Framework开发人员还是Ruby开发人员都很重要的开发平台,那就是在 Windows Phone 7 上使用 IronRuby。

前不久,我们曾给大家推荐过如何使用IronRuby开发Windows Phone 7应用程序这篇文章,今天继续给大家介绍一篇IronRuby如何开发Windows Phone 7的文章,希望读者能从中得到启发。

以下为转发的全文

几年前,我是一个不折不扣的.NET迷。 我对其他的开发领域毫无兴趣,整个人都沉醉于自己的封闭世界中。 随后,我又误打误撞地学习了 Ruby,那种体验简直不可思议。 那种利用语言的内置功能来完成工作的方式深深地吸引了我。

还有的就是,您可以让一个人领略 .NET 世界外部的事物,但.NET 将永远深深地扎根在那个人的心里。 因此,当我一听说微软 要在Microsoft .NET Framework 上开发一种名为IronRuby的Ruby语言的实现时,心里十分激动,然后便一头钻了进去。

现在,有了 IronRuby,.NET 世界和 Ruby 世界之间就架起了一座彼此连接的桥梁。 这可以使无限种新可能变为现实,这种连接的好处超乎想象。

在本文中,我将向您介绍其中一种无论对于 .NET Framework 开发人员还是Ruby开发人员都很重要的好处,那就是您可以在Windows Phone 7 上使用IronRuby。

什么是IronRuby?

2006 年,微软宣布开发IronRuby。 经过三年多的开发,IronRuby 团队终于在四月份宣布IronRuby 的第一个稳定版本(1.0 版)正式面市。

IronRuby 支持 Ruby 语言的完整功能集,唯一增加的功能是:Ruby 代码与 .NET Framework 代码之间的集成。 该集成是完全无缝的,唯一需要做的就是将 .NET Framework 程序集加载到 Ruby 上下文中。 例如,下面这段 IronRuby 代码首先加载 System.Windows.Forms 程序集,然后再利用其类:

  1.           require 'System.Windows.Forms' 
  2.  
  3. include System::Windows::Forms  
  4.  
  5. form = Form.  
  6.           new 
  7. form.height = 200  
  8. form.width = 400  
  9. form.text = "IronRuby Window" 
  10. form.show_dialog 

能够实现该集成可能要归功于动态语言运行时 (DLR),这是一个添加到 .NET Framework 基础结构中的层,用于为在该框架上编写的动态语言提供公共服务。 DLR 是在 CLR 基础上编写而成的,可以使在 .NET 上实现动态语言变得更加容易。 这是最近我们看到 .NET Framework 动态语言(包括 IronRuby、IronPython、IronJS、Nua、ClojureCLR 等等)不断兴起的主要原因之一。

IronRuby 的主要功能

Ruby 是一种动态语言,IronRuby 也是如此。 这就是说,在没有编译器的情况下,对于静态语言中在编译和生成期间完成的大多数操作,在运行时都能够完成。 这种行为可以提供当前大多数静态语言中难以或不可能实现的各种功能。

与 .NET Framework 对象的互操作性。Ruby 语言包含多种实现:MRI(即最初的实现)、Jruby、Rubinius、MacRub、IronRuby 等等。 IronRuby 之所以能够脱颖而出,要归功于其能够与 .NET Framework 对象方便地进行交互。 这种互操作性是双向的,即 .NET Framework 对象可以在 IronRuby 代码中使用,IronRuby 对象也可以在 .NET Framework 代码中使用。

动态类型化。IronRuby 变量类型可以在运行时计算得出,因此无需在代码中指定变量的类型。 但是,这并不表示 IronRuby 没有类型。 IronRuby 包含类型,而且和静态语言中的类型一样,每种类型都有其各自的规则。 以下代码示例用几个简单的步骤说明了动态类型化机制:

  1.       # Declaring a numeric variable  
  2. a = 1  
  3.  
  4. # The variable is of a numeric type   
  5. # and therefore numeric operations are available  
  6. a = a * 2 + 8 / 4  
  7.  
  8. # The next line will raise an exception  
  9. # because it is not possible to add a string to a number  
  10. a = a + "hello" 
  11.  
  12. # However, the next line is entirely legit and will result  
  13. # in changing the variable type to String  
  14. a = "Hello" 

交互式控制台。与 Windows 命令提示符类似,交互式控制台也是一种可以检索 IronRuby 代码并立即执行该代码的应用程序。 这种执行流也称为读取-求值-输出-循环 (REPL)。 您可以定义变量、方法甚至类,加载 IronRuby 文件或 .NET Framework 程序集,并立即使用它们。 例如,图 1 中显示一个简单的控制台会话,该会话中创建了一个类并立即使用该类。

使用 IronRuby 控制台

鸭子类型化。IronRuby 是一种面向对象的语言。 正如大家在面向对象的语言中所期待的那样,IronRuby 支持类、继承、封装和访问控制。 但是,与许多静态语言一样,它不支持接口和抽象类。

不过,这并不是该语言的设计缺陷。 有了动态类型化功能,声明接口或抽象类之类的代码约定显得多此一举。 唯一与对象有关的事项是是否定义了特定的方法;如果已定义,则无需进行标记。 这就是通常所说的鸭子类型化 - 如果某个类型的叫声像鸭子,游泳姿势也像鸭子,那么它就是一只鸭子,无需进行标记即可将其视为一只鸭子。

例如,下面的代码示例包含两个类,这些类包含一个名为 say_hi 的方法以及另一个名为 introduce 的常规方法,后者可以检索一个对象并执行其 say_hi 方法。(请注意,这里不存在接口或其他标记机制。)

  1.           class Human  
  2.   def say_hi  
  3.     puts "Hi!" 
  4.   end 
  5. end 
  6. class Duck  
  7.   def say_hi  
  8.     puts "Quack!" 
  9.   end 
  10. end 
  11.  
  12. def introduce(obj)  
  13.   obj.say_hi  
  14. end 
  15.  
  16. human = Human.  
  17.           new 
  18. duck = Duck.  
  19.           new 
  20.  
  21. introduce(human) # prints "Hi!"  
  22. introduce(duck) # prints "Quack!" 

元编程。IronRuby 提供了强大的元编程功能。 元编程是一种可在运行时添加、更改甚至删除方法的方式。 例如,可以向类中添加方法、写入定义其他方法的方法或删除现有类中的方法定义。 下面的代码的类中添加了一个方法,添加的方法将反映到该类的所有当前实例和将来实例中。

  1.           # Creating a class with no methods  
  2. class Demo  
  3. end 
  4.  
  5. # Creating an instance of class Demo  
  6. d = Demo.  
  7.           new 
  8.  
  9. # Opening the class and adding a new method - hello_world  
  10. class Demo  
  11.   def hello_world  
  12.     puts "hello world" 
  13.   end 
  14. end 
  15.  
  16. # Using the newly added method on the class instance  
  17. d.hello_world # prints "hello world" 

此外,还有一些特殊的方法可用于捕获对未定义的方法或常量的调用。 使用这些方法可以轻松地支持 find_by_[列名称] 之类的动态方法名称,其中 [列名称] 可以替换为 find_by_name、find_by_city 或 find_by_zipcode 之类的任何值。

RubyGems。Ruby 语言功能再强大,如果没有可以与其一起安装和使用的外部库,也不会取得如此巨大的成功。

安装 Ruby 库的主要方法是通过 RubyGems 系统。 这是一种程序包管理器,可以帮助分发和安装称为 gem 的 Ruby 库。 有数千种免费的 gem 可以使用,几乎涵盖了包括测试框架、税率计算库以及 Web 开发框架等在内的所有编程方面和任务。

您应该会注意到某些 RubyGems 依赖于 C 库。 这些 gem 无法在当前版本的 IronRuby 上运行,除非将 C 库移植到 Ruby 或 C# 平台上。

社区。IronRuby 的其中一个最大好处就是您可以访问 Ruby 社区。 该社区包含遍布于众多论坛、邮件列表、聊天室和博客中的宝贵内容,这些内容是由许多乐于助人解决任何问题的用户提供的。 不要犹豫,赶快利用这些资源吧,它们真的非常有用。

IronRuby 和 Silverlight

Silverlight 2 中引入了一项全新的重要功能:针对 DLR 语言的支持。 这样一来,开发人员就可以将 IronRuby 用于 Silverlight 应用程序,既可以将它融入到应用程序中,也可以使用它来编写整个 Silverlight 应用程序。

且慢,Silverlight 可以在 Windows Phone 7 上运行,对吧? 当然可以。

Windows Phone 7

Windows Phone 7

万众期待的 Windows Phone 7 是微软的下一代移动平台,它是智能手机行业的一项创新性突破。 除了标准的多点触控功能和炫目的新 UI 之外,从开发人员的角度来看,Windows Phone 7 的最大新闻莫过于它是在 Silverlight 平台上开发的。

正是归功于微软这一利用成熟技术的明智之举,广大开发人员只需轻松简单地学习一下,就可以创建移动应用程序了。

由于 DLR 语言可以在 Silverlight 环境中运行,因此您可以充分利用 IronRuby,使用它来编写 Windows Phone 7 应用程序。

不过,有一些限制需要注意。 Windows Phone 7 自带的 .NET Compact Framework 是 .NET Framework 的子集。 Compact Framework 专为移动应用程序和嵌入式应用程序而设计,包含完整 .NET Framework 的大约 30% 功能。 因此,它缺失了许多类,这会影响 IronRuby 的运行。

Reflection.Emit 命名空间是影响 IronRuby 的主要缺失功能。 IronRuby 使用此功能来动态地编译代码,以使应用程序更快地运行。 但是,它只属于性能上的优化,并不是运行简单脚本和应用程序所必备的组件。

另一个限制与新 Windows Phone 7 应用程序的创建方式有关。 这类应用程序只能通过 Visual Studio 并使用 C# 来创建。 这一要求迫使开发人员不得不使用 C# 编写代码来初始化 IronRuby 代码。

最后一个重要限制是 RubyGems 无法在 Windows Phone 7 上运行。 因此,要使用 gem,必须和任何其他 IronRuby 代码文件一样,先将其代码文件包含在应用程序文件中,然后再使用这些文件。#p#

在 Windows Phone 7 上构建简单的 IronRuby 应用程序

要开发 IronRuby 驱动的 Windows Phone 7 应用程序,需要先安装 Windows Phone 7 开发人员工具,这些工具可从 developer.windowsphone.com 上进行下载。

安装这些工具之后,请打开 Visual Studio,然后转到“文件”|“新建”|“项目”。 在“新建项目”对话框中,选择“Silverlight for Windows Phone”类别,然后选择“Windows Phone 应用程序”项目模板。 为该项目命名,然后继续操作。

新项目一打开,您就会看到已自动创建了一个简单的 XAML 文件。 请注意,XAML 通常是 Silverlight 必需的,并不依赖于语言。 因此,即使应用程序代码将使用 IronRuby 来编写,也必须使用 XAML 来创建 UI。在这个简单的应用程序中,默认的 XAML 文件已经够用,因此这里无需做任何更改。

这个简单的应用程序中,最值得关注的部分是代码。 不过,在对此进行深入探讨之前,我们需要添加对 IronRuby 和 DLR 程序集的引用。 这些程序集并不是常规的程序集,我们需要的是适用于 Windows Phone 7 的程序集,它们可以从 ironruby.codeplex.com/releases/view/43540#DownloadId=133276 上获取。 可以在下载的程序包的 silverlight/bin 文件夹中找到所需的程序集。

接下来,我们需要编写 IronRuby 代码。 向应用程序中添加一个新的文本文件,然后将其命名为 MainPage.rb。 此外,为了便于部署到手机中,请打开此文件的属性,然后将“生成操作”属性更改为“嵌入的资源”。

接下来,将下面的代码复制到该文件中。

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

以上IronRuby代码非常简单易懂;我们设置了标题,创建了一个文本块,其中包含一些文本,并将其添加到页面中。 请注意,您可以在上面提及的 Windows Phone 环境运行限制下,使用Ruby语言中的所有功能(这里就不演示了),例如类、元编程和库。

现在,剩下的任务就是实际执行 IronRuby 代码了。 要在应用程序加载时执行该代码,请将下面的代码添加到位于 MainPage.xaml.cs 文件内的 MainPage 类构造函数中。

下面代码以通过类构造函数执行 IronRuby 代码

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

上面的代码十分简短,完美地演示了通过 C# 代码运行 IronRuby 代码有多么容易。

另外,请务必将以下 using 语句添加到该类中:

  1.           using System.Reflection;  
  2. using System.IO;  
  3. using Microsoft.Scripting.Hosting;  
  4. using IronRuby; 

上面的第三行代码可以将 System.Windows.Media 程序集加载到 IronRuby 上下文中,从而使该代码可以与该程序集的类和枚举进行互操作。

下一行允许 IronRuby 代码访问当前的 Silverlight 页面。 该行代码通过名为 Phone 的常量向 IronRuby 代码公开当前实例 (this)。

其余的代码从嵌入的文件(请注意,应用程序的命名空间将添加到文件名中,因此 MainPage.rb 变成了 SampleWPApp.MainPage.rb)中读取 IronRuby 代码,然后使用引擎实例来执行该代码。

就是这样。 我们已经创建了一个应用程序,该应用程序加载后,会运行 IronRuby,而该代码将更改标题并向 Silverlight 页面添加一个文本块。 剩下要做的所有事情就是运行该应用程序,运行结果如下图 所示。

Windows Phone 7 上运行的 IronRuby 驱动的应用程序

每时每刻都在完善

即使在 Windows Phone 7 上使用 IronRuby 的工作流还并不完善,而且您需要注意各种限制,但这只是个起步而已。 IronRuby 和 Windows Phone 7 平台都是崭新的,它们时刻都在不断完善。

二者的结合同时给 .NET Framework 开发人员和 Ruby 开发人员展现了广大的前景。 现在,.NET 开发人员在编写 Windows Phone 7 应用程序时,可以充分利用 Ruby 语言无以伦比的功能,例如,将 IronRuby 控制台融入到其应用程序中或提供可扩展性功能。 而另一方面,Ruby 开发人员也可以史无前例地使用自己的语言来编写移动应用程序。

毫无疑问,一个充满大量机遇和无限可能的崭新世界已经诞生。 而且一切尽在您的掌控之中。

编者注:Shay Friedman 是一位 Microsoft Visual C#/IronRuby MVP,也是《IronRuby Unleashed》(Sams 出版,2010 年)一书的作者。他现在担任 Sela Group 的动态语言主管,负责全球范围的课程咨询和开设工作。可以在 IronShay.com 上阅读他的博客文章。本文出自MSDN 杂志2010年九月刊。

【编辑推荐】

  1. 不编程也开发 无代码开发Windows Phone 7应用工具
  2. 使用IronRuby开发Windows Phone 7应用程序
  3. Windows Phone 7设计评测报告
  4. 诺基亚向开发者赠送E7及Windows Phone 7手机
  5. 微软发布Windows Phone 7开发者向导

 

责任编辑:佚名 来源: MSDN
相关推荐

2011-02-28 10:42:14

Windows Pho微软

2012-01-01 19:33:19

2011-06-10 09:03:36

AndroidWindows Pho开发者

2011-05-10 08:53:46

iOSWindows Pho开发者

2011-08-19 09:09:01

AndroidWP7Windows Pho

2012-07-06 09:26:13

Windows PhoWindows Pho

2012-05-15 14:00:51

WP7开发环境

2011-06-13 09:34:02

微软AndroidWindows Pho

2012-03-04 20:55:33

WP7

2013-02-25 11:19:43

WP开发Windows PhoWP开发者

2012-05-25 12:57:31

Windows Pho

2012-03-22 14:50:00

WP7微软诺基亚

2012-04-05 13:39:42

WP7开发Windows Pho

2011-07-28 09:26:18

MangoWindows Pho富士通

2011-03-08 10:26:45

Windows Pho诺基亚Qt

2011-04-27 09:58:56

Windows PhoLBS微软

2013-06-17 14:10:08

WP7开发Windows Pho豆瓣电台

2011-09-22 14:20:10

雷军小米WP7

2012-06-21 09:07:22

微软WP7WP8

2011-10-27 09:26:46

点赞
收藏

51CTO技术栈公众号