IronRuby overloaded method selection?

I have the following C# code, which I’m trying to translate to IronRuby

var host = new ServiceHost(typeof(MyService ));
host.AddServiceEndpoint(typeof(IWcfContract), new WSHttpBinding(), new
Uri(“…”));

This compiles fine.

My ruby translation looks like this:

host = ServiceHost.new( MyService ) # this line works fine
host.add_service_endpoint( IWcfContract, WSHttpBinding.new,
Uri.new(“…”) )

As far as I can tell, that’s a direct translation and how it should
work,
but the second line always throws

wrong number or type of arguments for `add_service_endpoint’
(ArgumentError)

Is it something to do with the way IronRuby resolves overloads? that
method
has about 8 different overloads, but I’ve tried
passing in strings (and all the other overload combinations), and
nothing
helps.

Note which may be of use: The second parameter is typed to accept
System.ServiceModel.Channels.Binding, whereas the WSHttpBinding is about
3
or 4 steps down (up?) the inheritance tree from that. Could that be
confusing it?

Note 2: I’m running this particular IronRuby =>
http://nbs.blob.core.windows.net/dlr/DLR.10369.release.zip

At any rate:

  1. How can I figure out which overload IronRuby is deciding to call?
  2. How can I make it select the correct overload if it’s not doing so?

Could you try the latest build?
Also try:

host.method(:add_service_endpoint).clr_members.each { |m| puts
m.to_string }

What does it print?

Tomas

From: [email protected]
[mailto:[email protected]] On Behalf Of Orion E.
Sent: Wednesday, February 18, 2009 5:26 PM
To: [email protected]
Subject: [Ironruby-core] IronRuby overloaded method selection?

I have the following C# code, which I’m trying to translate to IronRuby

var host = new ServiceHost(typeof(MyService ));
host.AddServiceEndpoint(typeof(IWcfContract), new WSHttpBinding(), new
Uri(“…”));

This compiles fine.

My ruby translation looks like this:

host = ServiceHost.new( MyService ) # this line works fine
host.add_service_endpoint( IWcfContract, WSHttpBinding.new,
Uri.new(“…”) )

As far as I can tell, that’s a direct translation and how it should
work, but the second line always throws

wrong number or type of arguments for `add_service_endpoint’
(ArgumentError)

Is it something to do with the way IronRuby resolves overloads? that
method has about 8 different overloads, but I’ve tried
passing in strings (and all the other overload combinations), and
nothing helps.

Note which may be of use: The second parameter is typed to accept
System.ServiceModel.Channels.Binding, whereas the WSHttpBinding is about
3 or 4 steps down (up?) the inheritance tree from that. Could that be
confusing it?

Note 2: I’m running this particular IronRuby =>
http://nbs.blob.core.windows.net/dlr/DLR.10369.release.zip

At any rate:

  1. How can I figure out which overload IronRuby is deciding to call?
  2. How can I make it select the correct overload if it’s not doing so?

I’m now running 10606 from the nightly builds, and it seems to be
somewhat
fixed, but still not functioning. The error message now reads:

host.add_service_endpoint( IWcfContract, WSHttpBinding.new,
Uri.new("…") )
=> :0: can’t convert Module into ClrString (TypeError)

Running the code you suggested gives this:

host.method(:add_service_endpoint).clr_members.each { |m| puts
m.to_string }
System.ServiceModel.Description.ServiceEndpoint
AddServiceEndpoint(System.String, System.ServiceModel.Channels.Binding,
System.String)
System.ServiceModel.Description.ServiceEndpoint
AddServiceEndpoint(System.String, System.ServiceModel.Channels.Binding,
System.String, System.Uri)
System.ServiceModel.Description.ServiceEndpoint
AddServiceEndpoint(System.String, System.ServiceModel.Channels.Binding,
System.Uri)
System.ServiceModel.Description.ServiceEndpoint
AddServiceEndpoint(System.String, System.ServiceModel.Channels.Binding,
System.Uri, System.Uri)
System.ServiceModel.Description.ServiceEndpoint
AddServiceEndpoint(System.Type, System.ServiceModel.Channels.Binding,
System.String)
System.ServiceModel.Description.ServiceEndpoint
AddServiceEndpoint(System.Type, System.ServiceModel.Channels.Binding,
System.String, System.Uri)
System.ServiceModel.Description.ServiceEndpoint
AddServiceEndpoint(System.Type, System.ServiceModel.Channels.Binding,
System.Uri)
System.ServiceModel.Description.ServiceEndpoint
AddServiceEndpoint(System.Type, System.ServiceModel.Channels.Binding,
System.Uri, System.Uri)

It looks like IronRuby is having to choose between (String, Binding,
Uri)
and (Type, Binding, Uri), and is selecting the former (when I want it to
select the latter).

I’ve tried doing this

host.add_service_endpoint( IWcfContract.to_clr_type, WSHttpBinding.new,
Uri.new("…") )

but the error message is still the same (can’t convert module to
ClrString).

to_clr_type returns a System.RuntimeType - does this inherit from
System.Type or is it a different thing entirely? - my knowledge of the
CLR
in this area is somewhat weak :frowning:

Thanks a lot