Invoke member and dynamic binding isn't the same?

Hi
I have some ruby code, which through a process of instance_eval and
other
meta programming tricks builds an object with a method assign defined on
it.

I have this code in C#

var scope = Engine.CreateScope();
scope.SetVariable(“ctxt”, this);
Engine.ExecuteFile(“rubyfile.rb”, scope);

This code correctly sets a something property on this (linked with ctxt)
but when I then want to call a method on it that should exist

public dynamic Something { get; set; }

Something.assign(“ivan”)

Unhandled Exception:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:
‘Iro
nRuby.Builtins.RubyObject’ does not contain a definition for ‘assign’
at CallSite.Target(Closure , CallSite , Object , String )
at
System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid2[T0,T1](CallSite
site,
T0 arg0, T1 arg1)
at BugTracker_40.Bug.Assign(String assignee) in
C:\dev\ironruby-in-action\Sam
ples\BugTracker_40\BugTracker_40\Bug.cs:line 60
at BugTracker_40.Program.Main(String[] args) in
C:\dev\ironruby-in-action\Sam
ples\BugTracker_40\BugTracker_40\Program.cs:line 13

However the same code with:

var _rubyOperations = Engine.CreateOperations()
public object Something { get; set; }
_rubyOperations.InvokeMember(Something, “assign”, “ivan”)

does work.

The question is why? Is this the expected behavior? Am I missing an
assembly
reference (it has Ironruby.*, Microsoft.Scripting,
Microsoft.Scripting.Core)

Met vriendelijke groeten - Best regards - Salutations
Ivan Porto C.
Blog: http://flanders.co.nz
Google Wave: [email protected]
Twitter: http://twitter.com/casualjim
Author of IronRuby in Action (http://manning.com/carrero)

Can you send the entire source code that sets “Something” and then the
entire C# method that accesses it, ideally a minimal repro?

Tomas

From: [email protected]
[mailto:[email protected]] On Behalf Of Ivan Porto
Carrero
Sent: Wednesday, November 25, 2009 5:29 AM
To: ironruby-core
Subject: [Ironruby-core] invoke member and dynamic binding isn’t the
same?

Hi
I have some ruby code, which through a process of instance_eval and
other meta programming tricks builds an object with a method assign
defined on it.

I have this code in C#

var scope = Engine.CreateScope();
scope.SetVariable(“ctxt”, this);
Engine.ExecuteFile(“rubyfile.rb”, scope);

This code correctly sets a something property on this (linked with ctxt)
but when I then want to call a method on it that should exist

public dynamic Something { get; set; }

Something.assign(“ivan”)

Unhandled Exception:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: ‘Iro
nRuby.Builtins.RubyObject’ does not contain a definition for ‘assign’
at CallSite.Target(Closure , CallSite , Object , String )
at
System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid2[T0,T1](CallSite
site,
T0 arg0, T1 arg1)
at BugTracker_40.Bug.Assign(String assignee) in
C:\dev\ironruby-in-action\Sam
ples\BugTracker_40\BugTracker_40\Bug.cs:line 60
at BugTracker_40.Program.Main(String[] args) in
C:\dev\ironruby-in-action\Sam
ples\BugTracker_40\BugTracker_40\Program.cs:line 13

However the same code with:

var _rubyOperations = Engine.CreateOperations()
public object Something { get; set; }
_rubyOperations.InvokeMember(Something, “assign”, “ivan”)

does work.

The question is why? Is this the expected behavior? Am I missing an
assembly reference (it has Ironruby.*, Microsoft.Scripting,
Microsoft.Scripting.Core)

Met vriendelijke groeten - Best regards - Salutations
Ivan Porto C.
Blog: http://flanders.co.nz
Google Wave:
[email protected]mailto:[email protected]
Twitter: http://twitter.com/casualjim
Author of IronRuby in Action (http://manning.com/carrero)

I’ve included a C# project with all the files you need as attachment.

http://ironruby.codeplex.com/WorkItem/View.aspx?WorkItemId=3213

Met vriendelijke groeten - Best regards - Salutations
Ivan Porto C.
Blog: http://flanders.co.nz
Google Wave: [email protected]
Twitter: http://twitter.com/casualjim
Author of IronRuby in Action (http://manning.com/carrero)

On Wed, Nov 25, 2009 at 6:16 PM, Tomas M. <

d’oh
Indeed after using the correct libraries things do work, imagine that…

Thanks.


Met vriendelijke groeten - Best regards - Salutations
Ivan Porto C.
Blog: http://flanders.co.nz
Google Wave: [email protected]
Twitter: http://twitter.com/casualjim
Author of IronRuby in Action (http://manning.com/carrero)

On Mon, Nov 30, 2009 at 8:20 PM, Tomas M. <

It seems that you reference IronRuby binaries built against CLR 2.0. You
need to use CLR4 binaries:
http://ironruby.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=33305

Tomas

From: [email protected]
[mailto:[email protected]] On Behalf Of Ivan Porto
Carrero
Sent: Monday, November 30, 2009 1:08 AM
To: [email protected]
Subject: Re: [Ironruby-core] invoke member and dynamic binding isn’t the
same?

I’ve included a C# project with all the files you need as attachment.

http://ironruby.codeplex.com/WorkItem/View.aspx?WorkItemId=3213

Met vriendelijke groeten - Best regards - Salutations
Ivan Porto C.
Blog: http://flanders.co.nz
Google Wave:
[email protected]mailto:[email protected]
Twitter: http://twitter.com/casualjim
Author of IronRuby in Action (http://manning.com/carrero)

On Wed, Nov 25, 2009 at 6:16 PM, Tomas M.
<[email protected]mailto:[email protected]>
wrote:
Can you send the entire source code that sets “Something” and then the
entire C# method that accesses it, ideally a minimal repro?

Tomas

From:
[email protected]mailto:[email protected]
[mailto:[email protected]mailto:[email protected]]
On Behalf Of Ivan Porto C.
Sent: Wednesday, November 25, 2009 5:29 AM
To: ironruby-core
Subject: [Ironruby-core] invoke member and dynamic binding isn’t the
same?

Hi
I have some ruby code, which through a process of instance_eval and
other meta programming tricks builds an object with a method assign
defined on it.

I have this code in C#

var scope = Engine.CreateScope();
scope.SetVariable(“ctxt”, this);
Engine.ExecuteFile(“rubyfile.rb”, scope);

This code correctly sets a something property on this (linked with ctxt)
but when I then want to call a method on it that should exist

public dynamic Something { get; set; }

Something.assign(“ivan”)

Unhandled Exception:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: ‘Iro
nRuby.Builtins.RubyObject’ does not contain a definition for ‘assign’
at CallSite.Target(Closure , CallSite , Object , String )
at
System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid2[T0,T1](CallSite
site,
T0 arg0, T1 arg1)
at BugTracker_40.Bug.Assign(String assignee) in
C:\dev\ironruby-in-action\Sam
ples\BugTracker_40\BugTracker_40\Bug.cs:line 60
at BugTracker_40.Program.Main(String[] args) in
C:\dev\ironruby-in-action\Sam
ples\BugTracker_40\BugTracker_40\Program.cs:line 13

However the same code with:

var _rubyOperations = Engine.CreateOperations()
public object Something { get; set; }
_rubyOperations.InvokeMember(Something, “assign”, “ivan”)

does work.

The question is why? Is this the expected behavior? Am I missing an
assembly reference (it has Ironruby.*, Microsoft.Scripting,
Microsoft.Scripting.Core)

Met vriendelijke groeten - Best regards - Salutations
Ivan Porto C.
Blog: http://flanders.co.nz
Google Wave:
[email protected]mailto:[email protected]
Twitter: http://twitter.com/casualjim
Author of IronRuby in Action (http://manning.com/carrero)


Ironruby-core mailing list
[email protected]mailto:[email protected]
http://rubyforge.org/mailman/listinfo/ironruby-core