[Ironruby-core] Returning a Clr type in IronRuby

Paul Cowan dagda1 at scotalt.net
Tue Mar 3 13:51:15 EST 2009


I was running the test using the R# test runner and once I turned off the
shadow-copy assemblies being tested option then the test now passes.



2009/3/3 Tomas Matousek <Tomas.Matousek at microsoft.com>

>  The problem is that CLR/Mono assembly loader loads the assembly twice
> into 2 different contexts: “LoadNeither” and “Default”.
>
> Therefore there are actually 2 different types “BuildMetaData” in system.
>
>
>
> require 'Horn.Core.DSL.Domain' uses Assembly.LoadFrom to load the assembly,
> which loads it to one context.
>
> A static assembly reference (in C#) is loaded via Assembly.Load, which
> loads to a different context.
>
>
>
> You can use Kernel#load_assembly or require ‘<full assembly name>’ to
> invoke Assembly.Load.
>
>
>
> Tomas
>
>
>
> *From:* ironruby-core-bounces at rubyforge.org [mailto:
> ironruby-core-bounces at rubyforge.org] *On Behalf Of *Paul Cowan
> *Sent:* Tuesday, March 03, 2009 6:53 AM
> *To:* ironruby-core at rubyforge.org
> *Subject:* [Ironruby-core] Returning a Clr type in IronRuby
>
>
>
> 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.Runtime.LoadAssembly(typeof (BuildMetaData).Assembly);
>    engine.ExecuteFile(buildFile);
>    var klass = engine.Runtime.Globals.GetVariable("MetaDataFactory");
>    var instance = (RubyObject)engine.Operations.CreateInstance(klass);
>    var metaData = (BuildMetaData)engine.Operations.InvokeMember(instance,
> "return_meta_data");
>    Assert.Equal(metaData.Description, "A description of sorts");
> }
>
> It fails when trying to cast the object returned from IronRuby with the
> following error.
>
> System.InvalidCastException : [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\gjpo5svj.0zd\Horn.Dsl.Specificatioin\assembly\dl3\6d8ae49c\7acadf2b_c798c901\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 created in different
> locations.
>
> Is this possible in IronRuby yet?
>
> Cheers
>
> Paul
>
> _______________________________________________
> Ironruby-core mailing list
> Ironruby-core at rubyforge.org
> http://rubyforge.org/mailman/listinfo/ironruby-core
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://rubyforge.org/pipermail/ironruby-core/attachments/20090303/cfe996bb/attachment.html>


More information about the Ironruby-core mailing list