[Ironruby-core] problem

Tomas Matousek Tomas.Matousek at microsoft.com
Wed Mar 18 16:21:21 EDT 2009


The assembly seems to be loaded twice into 2 different loader contexts. “require” with a simple name (as opposed to strong name “Assembly, Version=…, Culture=…, PublicKeyToken=…“ or Kernel#load_assembly) uses Assembly.LoadFrom to load the assembly. If you have a reference to the assembly in your C# host that loads it using Assembly.Load, which loads to a different context. So you might end up loading the assembly (and types that are defined there) twice. The runtime then as two different Type objects for a single logical type.

Tomas

From: ironruby-core-bounces at rubyforge.org [mailto:ironruby-core-bounces at rubyforge.org] On Behalf Of Ivan Porto Carrero
Sent: Wednesday, March 18, 2009 12:23 PM
To: ironruby-core at rubyforge.org
Subject: Re: [Ironruby-core] problem

Are you using resharper for your unit tests?

2009/3/18 Nathan Stott <nrstott at gmail.com<mailto:nrstott at gmail.com>>
I dont know if this helps, but this is the full output of the test:
ComponentLoaderRegisteringComponentContext.ShouldRegisterComponent : Failed
CT_INIT: Object
UPDATED: Object                                             CreateInstanceSingleton        affected=1     rules=0
UPDATED: Object                                             CreateInstanceSingleton        affected=1     rules=0
CT_INIT: File::Constants
CT_INIT: IO
CT_INIT: File
UPDATED: Object                                             CreateInstanceSingleton        affected=1     rules=0
MT_INIT: Kernel
MT_INIT: Object
MT_INIT: <anonymous>
MT_INIT: Module
MT_INIT: Class
MT_INIT: <anonymous>
UPDATED: Object                                             CreateInstanceSingleton        affected=5     rules=1
MT_INIT: <anonymous>
LOADER: Loading assembly 'Motorpool.Calendar.Web.Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' and type ''
MT_INIT: Symbol
MT_INIT: Enumerable
MT_INIT: Hash
MT_INIT: Microsoft::Scripting::Actions::TypeTracker
MT_INIT: Microsoft::Scripting::Actions::TypeGroup
System.InvalidOperationException: can't convert Castle::Core::ComponentModel into Castle::Core::ComponentModel
at CallSite.Target(Closure , CallSite , RubyMethodScope , Object , Object )
at System.Dynamic.UpdateDelegates.UpdateAndExecute3<T0,T1,T2,TRet>(CallSite site, T0 arg0, T1 arg1, T2 arg2) in C:\git\ironruby\ndp\fx\src\Core\Microsoft\Scripting\Actions\UpdateDelegates.Generated.cs: line 509
at ℑℜ;component;;10;(Closure , Object , Proc , Object )
at CallSite.Target(Closure , CallSite , RubyScope , Object , Hash )
at System.Dynamic.UpdateDelegates.UpdateAndExecute3<T0,T1,T2,TRet>(CallSite site, T0 arg0, T1 arg1, T2 arg2) in C:\git\ironruby\ndp\fx\src\Core\Microsoft\Scripting\Actions\UpdateDelegates.Generated.cs: line 509
at ℑℜ;#;;0;(Closure , Scope , LanguageContext )
at Microsoft.Scripting.Runtime.LegacyScriptCode.Run() in C:\git\ironruby\Merlin\Main\Runtime\Microsoft.Scripting\Runtime\LegacyScriptCode.cs: line 43
at Microsoft.Scripting.SourceUnit.Execute() in C:\git\ironruby\Merlin\Main\Runtime\Microsoft.Scripting\SourceUnit.cs: line 239
at Microsoft.Scripting.Hosting.ScriptSource.Execute() in C:\git\ironruby\Merlin\Main\Runtime\Microsoft.Scripting\Hosting\ScriptSource.cs: line 138
at Motorpool.Calendar.Service.ComponentLoader.Load(IWindsorContainer container, TextReader reader) in ComponentLoader.cs: line 64
at Motorpool.Calendar.Web.Test.ComponentLoaderRegisteringComponentContext.ShouldRegisterComponent() in ComponentLoaderRegisteringComponentContext.cs: line 26

On Wed, Mar 18, 2009 at 1:55 PM, Nathan Stott <nrstott at gmail.com<mailto:nrstott at gmail.com>> wrote:
I tried that and no luck.

It doesn't seem that the assembly is not being loaded properly.  I'm able to use methods on the objects fine in the script.  However, it is that last call to the $container.Register(ComponentRegistration.new(model)) where for some reason it won't work.

ComponentRegistration.new() takes a ComponentModel.  The error seems to indicate that it is receiving a ComponentModel even with the same namespace prefixes but somehow it's not able to use it.
2009/3/18 Ivan Porto Carrero <ivan at flanders.co.nz<mailto:ivan at flanders.co.nz>>

You can try using the LoadAssembly method on the runtime object

runtime.LoadAssembly(typeof(IWindsorContainer).Assembly);

that should require the assembly a little nicer

I think you can also use load_assembly 'Castle.Windsor'

http://github.com/casualjim/ninject-dynamic/blob/0b531d9e3ae46cc3e8549c9cfc078a8c27e5dda7/src/Ninject.Dynamic/RubyEngine.cs#L166
http://github.com/casualjim/ninject-dynamic/blob/0b531d9e3ae46cc3e8549c9cfc078a8c27e5dda7/src/Ninject.Dynamic/RubyEngine.cs#L142
http://github.com/casualjim/ninject-dynamic/blob/0b531d9e3ae46cc3e8549c9cfc078a8c27e5dda7/src/Ninject.Dynamic/RubyEngine.cs#L90


2009/3/18 Nathan Stott <nrstott at gmail.com<mailto:nrstott at gmail.com>>

I'm using the hosting API.

This is the entire method:
                public void Load(IWindsorContainer container, TextReader reader)
                {
                            var runtime = Ruby.CreateRuntime();
                            ScriptEngine engine = Ruby.GetEngine(runtime);
                            var ctx = Ruby.GetExecutionContext(runtime);
                            ctx.DefineReadOnlyGlobalVariable("container", container);

                            string header =
                                        @"require 'Castle.Windsor'
require 'Castle.MicroKernel'
require 'Castle.Core'

ComponentRegistration = Castle::MicroKernel::Registration::ComponentRegistration
ComponentModel = Castle::Core::ComponentModel
Parameter = Castle::MicroKernel::Registration::Parameter
Component = Castle::MicroKernel::Registration::Component

def component(options)
    throw :classIsRequired if !options.has_key?(:class)

    klass = options[:class].to_clr_type

    if options.has_key?(:service)
                service = options[:service].to_clr_type
    else
                service = klass
    end

    if options.has_key?(:name)
                name = options[:name]
    else
                name = klass.class.name.underscore.lowercase
    end

    model = ComponentModel.new(name, service, klass)

    if options.has_key?(:parameters)
                parameters = options[:parameters]
                parameters.each do |p|
                            model.Parameters.Add(p.key, p.value)
                end
    end

    $container.Register(ComponentRegistration.new(model))
end";

                            ScriptSource headerSource = engine.CreateScriptSourceFromString(header);
                            headerSource.Execute();

                            string containerScript = reader.ReadToEnd();
                            ScriptSource source = engine.CreateScriptSourceFromString(containerScript);
                            source.Execute();
                }
    }

2009/3/18 Tomas Matousek <Tomas.Matousek at microsoft.com<mailto:Tomas.Matousek at microsoft.com>>

How do you run this script? From command line (ir.exe script.rb) or do you use hosting API?



Tomas



From: ironruby-core-bounces at rubyforge.org<mailto:ironruby-core-bounces at rubyforge.org> [mailto:ironruby-core-bounces at rubyforge.org<mailto:ironruby-core-bounces at rubyforge.org>] On Behalf Of Nathan Stott
Sent: Wednesday, March 18, 2009 8:33 AM
To: ironruby-core at rubyforge.org<mailto:ironruby-core at rubyforge.org>
Subject: [Ironruby-core] problem



Hi all.  I have a question that probably belongs on a users mailing list but I could not find one.



I get the following error when trying to use my IronRuby windsor registration script:

System.InvalidOperationException: can't convert Castle::Core::ComponentModel into Castle::Core::ComponentModel



I assume this has something to do with the fact that newing up an object in IronRuby isn't the same thing as newing it up in C#.



Any suggestions or guidance would be appreciated.



Here is the important IronRuby code:



require 'Castle.Windsor'

require 'Castle.MicroKernel'

require 'Castle.Core'



ComponentRegistration = Castle::MicroKernel::Registration::ComponentRegistration

ComponentModel = Castle::Core::ComponentModel

Parameter = Castle::MicroKernel::Registration::Parameter

Component = Castle::MicroKernel::Registration::Component



def component(options)

            throw :classIsRequired if !options.has_key?(:class)



            klass = options[:class].to_clr_type



            if options.has_key?(:service)

                        service = options[:service].to_clr_type

            else

                        service = klass

            end



            if options.has_key?(:name)

                        name = options[:name]

            else

                        name = klass.class.name.underscore.lowercase

            end



            model = ComponentModel.new(name, service, klass)



            if options.has_key?(:parameters)

                        parameters = options[:parameters]

                        parameters.each do |p|

                                    model.Parameters.Add(p.key, p.value)

                        end

            end



            $container.Register(ComponentRegistration.new(model))

end





_______________________________________________
Ironruby-core mailing list
Ironruby-core at rubyforge.org<mailto:Ironruby-core at rubyforge.org>
http://rubyforge.org/mailman/listinfo/ironruby-core


_______________________________________________
Ironruby-core mailing list
Ironruby-core at rubyforge.org<mailto:Ironruby-core at rubyforge.org>
http://rubyforge.org/mailman/listinfo/ironruby-core


_______________________________________________
Ironruby-core mailing list
Ironruby-core at rubyforge.org<mailto:Ironruby-core at rubyforge.org>
http://rubyforge.org/mailman/listinfo/ironruby-core



_______________________________________________
Ironruby-core mailing list
Ironruby-core at rubyforge.org<mailto: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/20090318/c8f77919/attachment-0001.html>


More information about the Ironruby-core mailing list