`

【IronRuby】细谈Ironruby与.NET的互操作性

阅读更多
作者: Ray Linn   最后更新:2010/07/19

引用.NET的Assembly
除了我们前面提到的require <PartialName> 和require <Strong name>外,Ironruby 1.0发布的时候,还提供了一个新的函数load_assembly,这个函数的参数为Assembly的名称,在内部,load_assembly会先调用Assembly.Load,如果找不到这个Assembly,那就再调用Assembly.LoadWithPartialName.它也支持require的两种调用方法。除此之外,load_assembly还可以接受第二个参数,指明只引用该Assembly下的某个名称空间,比如:
load_assembly 'IronRuby.Libraries', 'IronRuby.StandardLibrary.StringIO' 


名称空间namespace
当装配件被加载之后,它的顶层名称空间和类在ironruby内是可见的。比如下面这个例子
namespace Models {   
  public class Person {   
    private string name;   
    public Person(string name) {   
      this.name = name;   
    }   
    public string Name {    
      get {   
        return name;   
      }   
    }   
  }   

上面C#代码的名称空间“Models”与普通的ruby模块一样可被存取:
>>> require 'models'  
=> true  
>>> Models   
=> Models   
>>> Models.class  
=> Module

需要注意几点:
1.不可用小写的名称空间:Ruby常量要求使用大写开头的名字,所以名称空间必须遵循Ironruby的要求。
2.不可用“空”的名称空间: 对IronRuby来说,名称空间不能为空。而且由于CLR的名称空间只在有可访问的子类时才存在,因此假如名称空间的所有子类都是私有的,IronRuby 将无法访问该名称空间。所以名称空间内至少要有一个公共的可访问类。

因为名称空间被视为Ironruby的普通模块,所以它和其他ruby模块一样,可以被mixin.

class MyApp
  include "models"
  .....
end


使用C#的类

CLR中的类被视为普通的ruby类,这会为Ruby增加许多很有趣的特性。

1. Ruby中的泛型。
泛型一直被视为减少代码错误的一种有效方式,CLR提供了完美的“膨胀法”的泛型实现,因此在ironruby中使用CLR的泛型集合,取代原有的ruby实现,不失为提高动态语言代码质量的一种方法。
#使用CLR中的泛型
dict = System::Collections::Generic::Dictionary[String, Array].new  
#实际:System.Collections.Generic.Dictionary`2[IronRuby.Builtins.MutableString,IronRuby.Builtins.RubyArray]   
dict['foo'] = [1,2,3]
#可以使用所有的ruby方法
dic['foo'].map{|x|x+1}
#下面代码会抛出异常
dict[23] = '34' 
dict[23] = [4,5,6]   


2. Ruby中的GUI
Ruby中的类可以继承CLR中的类,因此可以使用CLR的WinForm为Ruby扩展出GUI而不需要类似Shoes之类的Ruby框架
require "System.Windows.Forms"  
include System::Windows::Forms   
class RForm < Form   
end  
f = RForm.new  


3.Reopen
如果想扩展CLR中的类,比如增加一个属性,有时候不需要大费周折去创建子类继承父类。CLR中的类一样可以被打开添加属性或者方法
class Models::Person   
  attr_reader :age  
  class << self  
    alias super_new new  
    def new(name, age)   
      instance = super_new(name)   
      instance.instance_variable_set(:"@age", age)   
      instance   
    end  
  end  
end  
  
Person.new("Jimmy", 25)  

方法

方法里值得一提的是,有些.NET方法带有out修饰,比如:
public string Foo(int i, out int j, out int k);  


该方法等价于:
return_value, j, k = Foo(5)


同样带有ref修饰的:
bool Foo(string a, out string b, string c, ref string d, string e, out string f);

等价于
return_value, b_out, d_out, f_out = foo('a_in ', 'c_in ', 'd_in', 'e_in ')


由于.NET里许多类被映射成Ruby的类,在许多时候可能会出现语义不清的状态,比如.NET和Ruby的String类,都带有replace方法,因此Ironruby也提供了一些方法,用于澄清语义。

to_clr_type:返回CLR里的实际类型
clr_member:指明调用CLR里的方法、属性或者字段,如System::String.new("a").clr_member(:Replace).call("a", "b")
clr_ctor: 某些类比如Thread被映射成IronRuby的类,clr_ctor可以让你指明调用原来.NET类的构造函数。
to_clr_string:由于CLR的String和Ruby的String不是同一个类,这个方法会返回CLR的String类型。

枚举
Enum在ironruby中被视为普通的类,可以直接被使用
require 'System.Windows.Forms'  
include System::Windows::Forms      
System::Enum.GetNames(AnchorStyles.to_clr_type)   
AnchorStyles.bottom | AnchorStyles.left


事件
在Ironruby中响应CLR中的事件有好几种方法:

1.最基础的方法,使用代码块(Block)
require "System.Windows.Forms"  
button = System::Windows::Forms::Button.new  
button.click { |sender, e| puts "Click!" }   
button.perform_click   


2.使用Proc对象,这个方法在必要事可以移除响应代码。
require "System.Windows.Forms"  
button = System::Windows::Forms::Button.new  
on_click = proc { |sender, e| puts "Click!" }   
button.click(&on_click)   
button.perform_click   
button.click.remove(on_click)   
button.perform_click   


我们陈述了一些Ironruby和CLR互动的一些细节问题,这些是Ironruby有别于其他ruby实现的方面,体现了基于CLR实现Ruby的许多优点。值得一提的是,Ironruby是遵循Ruby规范的实现,大部分Ruby代码都可以在上面无缝运行,比如rails。

总结一下Ironruby和CLR通讯需要注意的一些问题:

1.CLR的名称空间和接口必须首字大写,以便映射到ruby的模块。
2.CLR的类必须首字大写以便映射成Ruby类。
3.CLR的方法可以按原有的方法名调用,也可以用ruby风格的方法名调用,即“骆驼式命名法”或 "Mangling命名法"皆可。
4.CLR的虚方法可以在Ironruby用上述二种命名法重写。
分享到:
评论

相关推荐

    [博客空间]IronRuby博客中文版 Alpha_ironruby-pre-alpha1(ASP.NET源码).rar

    IronRuby是基于DLR(Dynamic Language Runtime,动态语言运行时)构建的,DLR是.NET Framework的一部分,为动态语言提供了一套运行时环境和语言互操作性支持。通过IronRuby,开发者可以利用Ruby的简洁语法和灵活性,...

    Sams.IronRuby.Unleashed.Feb.2010.pdf

    开发者可以轻松地在IronRuby代码中调用.NET类库,反之亦然,从而实现了语言间的互操作性。此外,IronRuby还支持.NET的多线程模型,提高了程序的并发处理能力。 #### 使用场景 IronRuby适合于需要快速开发、高灵活...

    ASP.NET源码——[博客空间]IronRuby博客中文版 Alpha.zip

    这为开发者带来了Ruby的动态性和.NET的高性能、稳定性的结合,特别是在Web开发中,可以利用IronRuby与ASP.NET的集成,实现快速开发和灵活的编程。 在这个【博客空间】IronRuby博客中文版中,我们可以期待找到关于...

    IronRuby博客中文版_多用户博客空间源码下载.rar

    使用IronRuby开发的博客系统将与.NET紧密集成,充分利用其类库和服务。 3. **多用户博客系统**:这是一个允许多个用户创建并管理各自博客的平台。它涉及到用户认证、权限管理、数据库设计(如用户信息存储、博客...

    IronRuby开发包(Pre Alpha1)

    IronRuby 是 Ruby 编程语言在微软 .NET 平台上的一种实现。 IronRuby 与 Wilco Bauwer 的 IronRuby project 同名,2007年4月30日由微软于 MIX 上发表。并计划于2007年的 OSCON 公开推出。 2007年8月31日,John Lam...

    精通C#5.0与.net4.5高级编程.

    - 动态类型:动态类型允许在运行时确定变量的类型,增强了语言的灵活性,特别适合与动态语言如IronPython或IronRuby交互。 - 自动属性初始化器:简化了属性的初始化过程,可以在声明属性时同时赋值。 - 遍历接口...

    Professional C# 5.0 and .NET 4.5.1.pdf_c#5.0_

    此外,C# 5.0还引入了动态类型(`dynamic`),它允许在运行时确定变量的类型,增强了与动态语言如IronPython和IronRuby的互操作性。动态类型可以用于简化与COM对象交互或处理JSON等动态数据。 另一个显著的改进是...

    .net framework 4.0 这个上传错了

    8. **互操作性**:提升了与COM组件、WinRT(Windows Runtime)和非托管代码的互操作性。 9. **安全性和稳定性**:修复了许多已知的安全漏洞,增强了框架的整体稳定性和安全性。 10. **部署和配置**:改进了安装和...

    Sams.IronRuby.Unleashed.Feb.2010.rar

    3. **IronRuby集成**:IronRuby是.NET Framework的一部分,它允许Ruby代码与.NET环境无缝交互。开发者可以使用.NET的类库,同时利用Ruby的简洁语法,这对于跨语言开发和团队合作具有很大的优势。 4. **元编程**:...

    .net framework4.0 x64_x86简体中文语言包

    3. **动态语言支持**:引入了Dynamic Language Runtime(DLR),使得动态类型语言如IronPython和IronRuby能更好地与.NET Framework集成。 4. **ADO.NET Entity Framework**:这是一个ORM(对象关系映射)工具,简化...

    [IronRuby] C# 4.0调用ActiveRecord

    IronRuby与Ruby一样支持动态类型系统、元编程和Ruby on Rails框架。 知识点二:C# 4.0 C# 4.0是微软公司开发的面向对象的编程语言,它是.NET框架的一部分。C# 4.0引入了动态类型(dynamic),协变和逆变,可选参数...

    Microsoft.NET4.0.rar

    3. **动态语言支持**:添加了Dynamic Language Runtime (DLR),使得动态语言如IronPython和IronRuby可以更好地集成到.NET环境中。 4. **改进的内存管理**:通过增强的垃圾回收机制,减少了内存碎片,提升了整体性能...

    Microsoft.NET.zip .net4.0环境压缩包

    - **Dynamic Language Runtime (DLR)**:支持动态语言(如IronPython和IronRuby),并与.NET Framework交互。 - **ADO.NET Entity Framework 4.0**:提升了数据访问层的抽象和数据建模能力,支持ORM(对象关系映射)...

    Microsoft.NET.4.0..rar

    总之,.NET Framework 4是一个强大的开发平台,它为开发者提供了丰富的工具和功能,以创建高效、安全、跨语言的应用程序,并且与Windows操作系统紧密集成,确保了良好的兼容性和稳定性。通过不断的技术迭代和优化,...

    Microsoft.Framework.NET4.0

    在语言支持方面,.NET Framework 4.0不仅支持C#、VB.NET和F#等传统语言,还引入了动态编程的支持,通过Dynamic Language Runtime (DLR),使得IronPython和IronRuby等动态语言可以在.NET平台上无缝运行。 对于开发者...

    ironruby-pre-alpha1.zip_pre

    IronRuby是微软开发的一个开源项目,它允许在.NET Framework上运行Ruby编程语言,实现了Ruby的兼容性和.NET平台的集成。这个“ironruby-pre-alpha1.zip_pre”文件是IronRuby项目的早期预览版本,即Pre-Alpha1阶段的...

    23个.NET开源项目

    此外,文中还特别提到了一些遵循MS-PL(Microsoft Public License)许可的开源项目,如ASP.NET MVC、.NET Dynamic Language Runtime (DLR)、IronRuby、IronPython、Silverlight Toolkit、Ajax Control Toolkit、...

    .net framework 4.0

    .NET Framework 4.0还加强了安全性,包括更细粒度的权限管理、改进的加密算法以及对ASP.NET的跨站请求伪造(CSRF)防护。此外,它还引入了AppDomain隔离,允许在单个进程中运行多个独立的应用程序域,从而提高了系统...

    .Net 4.0 Framework and Extentions

    1. Service Model Metadata Tool (Svcutil.exe)更新:提供更好的互操作性和支持更多的标准协议。 2. WCF Data Services(前身为Astoria):提供了基于RESTful服务的数据访问框架,支持OData协议。 六、Windows ...

Global site tag (gtag.js) - Google Analytics