4

Iron Ruby から CLR オブジェクトを返そうとしています。

C#で定義された次のCLRタイプがあります

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 は、場所「C:\Projects\horn\branches\rubydsl\src\Horn」の「LoadNeither」コンテキストの「Horn.Core.DSL.Domain、Version=1.0.0.0、Culture=neutral、PublicKeyToken=null」から発生します。 .Dsl.Specificatioin\bin\Debug\Horn.Core.DSL.Domain.dll'. タイプ B は、場所「C:\Users\paul.cowan\AppData\Local\Temp」の「Default」コンテキストの「Horn.Core.DSL.Domain、Version=1.0.0.0、Culture=neutral、PublicKeyToken=null」から発生します。 \1vt2usw2.rxf\Horn.Dsl.Specificatioin\assembly\dl3\1d5ed945\7c19e429_1a97c901\Horn.Core.DSL.Domain.DLL'.

Iron Ruby から CLR 型を返すことは可能ですか?

4

2 に答える 2

4

特別に細工された Ruby の文字列を使用してメソッドを取得し、C# を使用してメソッドを呼び出すよりも、C# から Ruby コードを呼び出すための推奨される方法は次のとおりです。

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")

〜ジミー

于 2009-02-26T23:32:23.530 に答える
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# テスト ランナーからのシャドウ コピーをオフにすると、テストに合格するようになりました。

于 2009-03-04T07:53:27.213 に答える