Re: Returning a CLR type from IronRuby
Fabian Schmied <[email protected]> Tue, 3 Mar 2009 09:39:17 +0100
| Newsgroups | gmane.comp.windows.devel.dotnet.advanced |
|---|---|
| Message-ID | <[email protected]> |
> [A]Horn.Core.DSL.Domain.BuildMetaData cannot be cast to > [B]Horn.Core.DSL.Domain.BuildMetaData. Type A originates from > 'Horn.Core.DSL.Domain, Version=1.0.0.0, Culture=neutral, > PublicKeyToken=null' in the context 'LoadNeither' at location > 'C:\Projects\horn\branches\rubydsl\src\Horn.Dsl.Specificatioin\bin\Debug\Horn.Core.DSL.Domain.dll'. > Type B originates from 'Horn.Core.DSL.Domain, Version=1.0.0.0, > Culture=neutral, PublicKeyToken=null' in the context 'Default' at location > 'C:\Users\paul.cowan\AppData\Local\Temp\1vt2usw2.rxf\Horn.Dsl.Specificatioin\assembly\dl3\1d5ed945\7c19e429_1a97c901\Horn.Core.DSL.Domain.DLL'. While you'd probably get better answers at a Ruby-specific site, I'll give it a try: The problem seems to be that IronRuby loads the Horn.Core.DSL.Domain.dll assembly for a second time (and from a different location), so the BuildMetaData type used by your IronRuby class is not the same as the one used by the C# class. Can you try to do the following: engine.Runtime.LoadAssembly (typeof (BuildMetaData).Assembly); // or similar at the beginning? Fabian On Tue, Mar 3, 2009 at 7:22 AM, Paul Cowan <[email protected]> wrote: > Hi, > > I am trying to return a CLR object from Iron Ruby. > > I have the following CLR type defined in C# > public class BuildMetaData > { > public string Description { get; set; } > } > > > I have the following IronRuby file: > > $:.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 > > I have the following test that is failing: > > [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"); > } > > > > > It fails when trying to cast the object returned from IronRuby. > > I get the following error message: > > [A]Horn.Core.DSL.Domain.BuildMetaData cannot be cast to > [B]Horn.Core.DSL.Domain.BuildMetaData. Type A originates from > 'Horn.Core.DSL.Domain, Version=1.0.0.0, Culture=neutral, > PublicKeyToken=null' in the context 'LoadNeither' at location > 'C:\Projects\horn\branches\rubydsl\src\Horn.Dsl.Specificatioin\bin\Debug\Horn.Core.DSL.Domain.dll'. > Type B originates from 'Horn.Core.DSL.Domain, Version=1.0.0.0, > Culture=neutral, PublicKeyToken=null' in the context 'Default' at location > 'C:\Users\paul.cowan\AppData\Local\Temp\1vt2usw2.rxf\Horn.Dsl.Specificatioin\assembly\dl3\1d5ed945\7c19e429_1a97c901\Horn.Core.DSL.Domain.DLL'. > > The only way I can access the members of the BuildMetaData is using > reflection. > > If you look at the error message, both types are in different locations. > > Is there a way round this yet in Ironruby? > > Cheers > > Paul > > =================================== > View archives and manage your subscription(s) at http://peach.ease.lsoft.com/archives > > =================================== View archives and manage your subscription(s) at http://peach.ease.lsoft.com/archives