[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