Возврат типа CLR из IronRuby - PullRequest
       13

Возврат типа CLR из IronRuby

4 голосов
/ 25 февраля 2009

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

У меня есть следующий тип 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 = нейтральный, PublicKeyToken = null' в контексте 'LoadNeither' в расположении 'C: \ Projects \ horn \ branch \ rubydsl \ src \ Horn .Dsl.Specificatioin \ Bin \ Debug \ Horn.Core.DSL.Domain.dll. Тип B происходит от «Horn.Core.DSL.Domain, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null» в контексте «По умолчанию» в расположении «C: \ Users \ paul.cowan \ AppData \ Local \ Temp». \ 1vt2usw2.rxf \ Horn.Dsl.Specificatioin \ сборка \ DL3 \ 1d5ed945 \ 7c19e429_1a97c901 \ Horn.Core.DSL.Domain.DLL».

Можно ли вернуть типы CLR из Iron Ruby

Ответы [ 2 ]

4 голосов
/ 27 февраля 2009

Вместо того, чтобы получать метод со специально созданной строкой 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")

~ Jimmy

1 голос
/ 04 марта 2009

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

Мой код в итоге выглядел так:

[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 #, то тест сейчас проходит.

...