2009-02-25 2 views
4

Я пытаюсь вернуть объект CLR из Iron Ruby.Возврат CLR-типа от IronRuby

Я следующий тип CLR определяется в C#

public class BuildMetaData 
{ 
    public string Description { get; set; } 
} 

У меня есть следующий IronRuby файл:

$:.unshift(File.dirname(__FILE__) + '/../bin/Debug') 
require 'mscorlib' 
require 'Horn.Core.DSL.Domain' 

class MetaDataFactory 
    def return_meta_data() 
     meta = Horn::Core::DSL::Domain::BuildMetaData.new 
     meta.Description = "A description of sorts" 
     meta 
    end 
end 

У меня есть следующий тест, который не удается:

[Fact] 
public void Then_a_build_metadata_object_is_returned() 
{      
    var engine = Ruby.CreateEngine(); 

    engine.ExecuteFile("test.rb"); 

    var code = String.Format("{0}.new.method :{1}", "MetaDataFactory", "return_meta_data"); 

    var action = engine.CreateScriptSourceFromString(code).Execute(); 

    var result = (BuildMetaData)engine.Operations.Call(action); 

    Assert.Equal(result.Description, "A description of sorts"); 
} 

Он не работает при попытке передать объект, возвращенный из IronRuby.

я получаю следующее сообщение об ошибке:

[A] Horn.Core.DSL.Domain.BuildMetaData не может быть приведен к [B] Horn.Core.DSL.Domain.BuildMetaData. Тип A происходит от «Horn.Core.DSL.Domain, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null» в контексте «LoadNeither» в месте «C: \ Projects \ horn \ branches \ rubydsl \ src \ Horn .Dsl.Specificatioin \ Bin \ Debug \ Horn.Core.DSL.Domain.dll. Тип B происходит от «Horn.Core.DSL.Domain, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null» в контексте «По умолчанию» в месте «C: \ Users \ paul.cowan \ AppData \ Local \ Temp \ 1vt2usw2.rxf \ Horn.Dsl.Specificatioin \ сборка \ DL3 \ 1d5ed945 \ 7c19e429_1a97c901 \ Horn.Core.DSL.Domain.DLL.

Можно ли возвращать типы CLR из железного Рубина

ответ

1

на самом деле все это было вплоть до теневого копирования.

Мой код закончился выглядеть так:

[Fact] 
public void Then_the_object_should_be_accessible_in_csharp() 
{      
    var engine = Ruby.CreateEngine(); 

    engine.Runtime.LoadAssembly(typeof (BuildMetaData).Assembly); 

    engine.ExecuteFile(buildFile); 

    var klass = engine.Runtime.Globals.GetVariable("MetaDataFactory"); 

    var instance = (RubyObject)engine.Operations.CreateInstance(klass); 

    //You must have shadow-copying turned off for the next line to run and for the test to pass. 
    //E.g. in R# "ReSharper/Options/Unit Testing/Shadow-Copy Assemblies being tested" should be un-checked. 
    var metaData = (BuildMetaData)engine.Operations.InvokeMember(instance, "return_meta_data"); 

    Assert.Equal(metaData.Description, "A description of sorts"); 

    Assert.Equal(metaData.Dependencies.Count, 1); 
} 

Но если я выключил тень копирования из R # тест бегун, то испытание в настоящее время проходит.

4

Вместо того, чтобы получать метод с помощью специально сформированной строки Ruby, а затем с помощью C# для вызова метода, предпочтительный способ вызова в Ruby-код из C# заключается в следующем:

var engine = IronRuby.Ruby.CreateEngine() 
engine.ExecuteFile("test.rb") 
var klass = engine.Runtime.Globals.GetVariable("MetaDataFactory") 
var instance = engine.Operations.CreateInstance(klass) 
engine.Operations.InvokeMember(instance, "return_meta_data") 

~ Джимми