Rückgabe eines CLR-Typ von IronRuby
Frage
Ich versuche, ein CLR-Objekt von Iron Ruby zurück.
Ich habe folgenden CLR-Typen definiert in C #
public class BuildMetaData
{
public string Description { get; set; }
}
Ich habe folgende IronRuby-Datei:
$:.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
Ich habe folgenden Test, den fehlschlägt:
[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");
}
Es schlägt fehl, wenn man versucht, das Objekt zu werfen von IronRuby zurück.
Ich erhalte die folgende Fehlermeldung:
[A] Horn.Core.DSL.Domain.BuildMetaData nicht auf [B] Horn.Core.DSL.Domain.BuildMetaData gegossen werden. Typ A stammt aus 'Horn.Core.DSL.Domain, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null' im Rahmen 'LoadNeither' am Ort ‚C: \ Projects \ Horn \ Zweige \ rubydsl \ src \ Horn .Dsl.Specificatioin \ bin \ Debug \ Horn.Core.DSL.Domain.dll‘. Typ B stammt aus 'Horn.Core.DSL.Domain, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null' im Zusammenhang mit 'Standard' am Ort ‚C: \ Benutzer \ paul.cowan \ AppData \ Local \ Temp \ 1vt2usw2.rxf \ Horn.Dsl.Specificatioin \ assembly \ dl3 \ 1d5ed945 \ 7c19e429_1a97c901 \ Horn.Core.DSL.Domain.DLL‘.
Ist es möglich, CLR-Typen von Iron Ruby-
zurückLösung 2
Eigentlich war es alles auf dem Kopieren beschatten.
Mein Code am Ende aussehen wie folgt aus:
[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);
}
Aber wenn ich Schatten-Kopieren von der R # Test-Runner ausgeschaltet dann dem Test jetzt passiert.
Andere Tipps
Anstatt das Verfahren mit einem speziell gestalteten Zeichenfolge von Ruby bekommen, und dann C # unter Verwendung das Verfahren zu nennen, die bevorzugte Art und Weise in Ruby-Code von C # zu nennen, ist das folgende:
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