سؤال

أحاول إعادة كائن CLR من 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.buildmetatata. اكتب النشأ من "horn.core.dsl.domain"، الإصدار = 1.0.0.0، الثقافة = محايد، و publickeytoken = null "في السياق" loadneets "في الموقع 'c: projects horn branches rubydsl src horn .dsl.specificatioin bin debug horn.core.dsl.dl.dll '. النوع B ينشأ من "horn.core.dsl.domain"، الإصدار = 1.0.0.0، الثقافة = محايد، و publickeytoken = null "في السياق" الافتراضي "في الموقع 'c: المستخدمين paul.cowan appdata local temp 1vt2usw2.rxf horn.dsl.specificatioin Assembly DL3 1D5ED945 7C19E429_1A97C901 horn.core.dsl.dld.dll '.

هل من الممكن إرجاع أنواع CLR من Ruby Iron

هل كانت مفيدة؟

المحلول 2

في الواقع كان كل شيء إلى نسخ الظل.

انتهت رمزي إلى الأعلى

[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 # ثم يمر الاختبار الآن.

نصائح أخرى

بدلا من الحصول على طريقة بسلسلة مصنوعة خصيصا من 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")

~ جيمي

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top