How to implement a C# interface from Ruby?


#1

Hello again,
I’m playing around with the idea of using IronRuby to implement plugins
for
a C#-based system (namely, CruiseControl.Net).

I’m having some difficulties trying to figure out what the correct
syntax
for that would be. I’m currently using this to bootstrap the engine:

var reader = new StreamReader(“plugin.rb”);
var code = reader.ReadToEnd();
reader.Close();

var engine = IronRuby.Ruby.CreateEngine();
engine.Execute(code);

The code inside plugin.rb is trying to implement an existing C#
interface:

public interface IDoSomething {
void HelloWorld();
}

I tried:

class Doer
include IDoSomething

def hello_world
puts “hello”
end
end

but it fails. What would be the correct syntax for a Ruby class to
implement
this ?

thanks!

– Thibaut


#2

How does it fail? Nothing fails for me, but how are you trying to use
this Ruby class?

(test.cs has your c# code in it):

C:\dev>csc.exe /t:library test.cs
Microsoft ® Visual C# 2008 Compiler version 3.5.30729.715
for Microsoft ® .NET Framework version 3.5
Copyright © Microsoft Corporation. All rights reserved.

C:\dev>ir
IronRuby 1.0.0.0 on .NET 2.0.50727.3521
Copyright © Microsoft Corporation. All rights reserved.

require ‘test.dll’
=> true

class Doer
… include IDoSomething
… def hello_world
… puts “hello”
… end
… end
=> nil

Doer
=> Doer

Doer.new
=> #Doer:0x000005c

Doer.new.hello_world
hello
=> nil

~js

From: removed_email_address@domain.invalid
[mailto:removed_email_address@domain.invalid] On Behalf Of Thibaut
Barrère
Sent: Monday, February 09, 2009 5:23 PM
To: ironruby-core
Subject: [Ironruby-core] How to implement a C# interface from Ruby ?

Hello again,

I’m playing around with the idea of using IronRuby to implement plugins
for a C#-based system (namely, CruiseControl.Net).

I’m having some difficulties trying to figure out what the correct
syntax for that would be. I’m currently using this to bootstrap the
engine:

                              var reader = new 

StreamReader(“plugin.rb”);
var code = reader.ReadToEnd();
reader.Close();

                              var engine = 

IronRuby.Ruby.CreateEngine();
engine.Execute(code);

The code inside plugin.rb is trying to implement an existing C#
interface:

      public interface IDoSomething {
                  void HelloWorld();
      }

I tried:

class Doer
include IDoSomething

def hello_world
puts “hello”
end
end

but it fails. What would be the correct syntax for a Ruby class to
implement this ?

thanks!

– Thibaut


#3

You need to call the method from C# to check whether it is actually
bound to the CLR interface implementation. The method will always be
callable from Ruby.

Tomas

From: removed_email_address@domain.invalid
[mailto:removed_email_address@domain.invalid] On Behalf Of Jimmy
Schementi
Sent: Monday, February 09, 2009 5:43 PM
To: removed_email_address@domain.invalid
Subject: Re: [Ironruby-core] How to implement a C# interface from Ruby ?

How does it fail? Nothing fails for me, but how are you trying to use
this Ruby class?

(test.cs has your c# code in it):

C:\dev>csc.exe /t:library test.cs
Microsoft ® Visual C# 2008 Compiler version 3.5.30729.715
for Microsoft ® .NET Framework version 3.5
Copyright © Microsoft Corporation. All rights reserved.

C:\dev>ir
IronRuby 1.0.0.0 on .NET 2.0.50727.3521
Copyright © Microsoft Corporation. All rights reserved.

require ‘test.dll’
=> true

class Doer
… include IDoSomething
… def hello_world
… puts “hello”
… end
… end
=> nil

Doer
=> Doer

Doer.new
=> #Doer:0x000005c

Doer.new.hello_world
hello
=> nil

~js

From: removed_email_address@domain.invalid
[mailto:removed_email_address@domain.invalid] On Behalf Of Thibaut
Barrère
Sent: Monday, February 09, 2009 5:23 PM
To: ironruby-core
Subject: [Ironruby-core] How to implement a C# interface from Ruby ?

Hello again,

I’m playing around with the idea of using IronRuby to implement plugins
for a C#-based system (namely, CruiseControl.Net).

I’m having some difficulties trying to figure out what the correct
syntax for that would be. I’m currently using this to bootstrap the
engine:

                              var reader = new 

StreamReader(“plugin.rb”);
var code = reader.ReadToEnd();
reader.Close();

                              var engine = 

IronRuby.Ruby.CreateEngine();
engine.Execute(code);

The code inside plugin.rb is trying to implement an existing C#
interface:

      public interface IDoSomething {
                  void HelloWorld();
      }

I tried:

class Doer
include IDoSomething

def hello_world
puts “hello”
end
end

but it fails. What would be the correct syntax for a Ruby class to
implement this ?

thanks!

– Thibaut


#4

Have you tried “def HelloWorld; end” (ie. match the interface method
casing)?

Tomas

From: removed_email_address@domain.invalid
[mailto:removed_email_address@domain.invalid] On Behalf Of Thibaut
Barrère
Sent: Monday, February 09, 2009 5:23 PM
To: ironruby-core
Subject: [Ironruby-core] How to implement a C# interface from Ruby ?

Hello again,

I’m playing around with the idea of using IronRuby to implement plugins
for a C#-based system (namely, CruiseControl.Net).

I’m having some difficulties trying to figure out what the correct
syntax for that would be. I’m currently using this to bootstrap the
engine:

                                var reader = new 

StreamReader(“plugin.rb”);
var code = reader.ReadToEnd();
reader.Close();

                                var engine = 

IronRuby.Ruby.CreateEngine();
engine.Execute(code);

The code inside plugin.rb is trying to implement an existing C#
interface:

        public interface IDoSomething {
                    void HelloWorld();
        }

I tried:

class Doer
include IDoSomething

def hello_world
puts “hello”
end
end

but it fails. What would be the correct syntax for a Ruby class to
implement this ?

thanks!

– Thibaut


#5

Ah, me = dummy. You have that interface in C#, and the IronRuby code
you’re hosting can’t see the interface. This should expose all the types
in the current assembly:

engine.Runtime.LoadAssembly(GetType().Assembly);

~js

From: removed_email_address@domain.invalid
[mailto:removed_email_address@domain.invalid] On Behalf Of Jimmy
Schementi
Sent: Monday, February 09, 2009 5:43 PM
To: removed_email_address@domain.invalid
Subject: Re: [Ironruby-core] How to implement a C# interface from Ruby ?

How does it fail? Nothing fails for me, but how are you trying to use
this Ruby class?

(test.cs has your c# code in it):

C:\dev>csc.exe /t:library test.cs
Microsoft ® Visual C# 2008 Compiler version 3.5.30729.715
for Microsoft ® .NET Framework version 3.5
Copyright © Microsoft Corporation. All rights reserved.

C:\dev>ir
IronRuby 1.0.0.0 on .NET 2.0.50727.3521
Copyright © Microsoft Corporation. All rights reserved.

require ‘test.dll’
=> true

class Doer
… include IDoSomething
… def hello_world
… puts “hello”
… end
… end
=> nil

Doer
=> Doer

Doer.new
=> #Doer:0x000005c

Doer.new.hello_world
hello
=> nil

~js

From: removed_email_address@domain.invalid
[mailto:removed_email_address@domain.invalid] On Behalf Of Thibaut
Barrère
Sent: Monday, February 09, 2009 5:23 PM
To: ironruby-core
Subject: [Ironruby-core] How to implement a C# interface from Ruby ?

Hello again,

I’m playing around with the idea of using IronRuby to implement plugins
for a C#-based system (namely, CruiseControl.Net).

I’m having some difficulties trying to figure out what the correct
syntax for that would be. I’m currently using this to bootstrap the
engine:

                              var reader = new 

StreamReader(“plugin.rb”);
var code = reader.ReadToEnd();
reader.Close();

                              var engine = 

IronRuby.Ruby.CreateEngine();
engine.Execute(code);

The code inside plugin.rb is trying to implement an existing C#
interface:

      public interface IDoSomething {
                  void HelloWorld();
      }

I tried:

class Doer
include IDoSomething

def hello_world
puts “hello”
end
end

but it fails. What would be the correct syntax for a Ruby class to
implement this ?

thanks!

– Thibaut


#6

// test.dll
public interface IDoSomething {
void HelloWorld();
}
public class Foo {
public void Bar(IDoSomething i) {
i.HelloWorld();
}
}

C:\dev>ir
IronRuby 1.0.0.0 on .NET 2.0.50727.3521
Copyright © Microsoft Corporation. All rights reserved.

require ‘test.dll’
=> true

class Doer
… include IDoSomething
… def hello_world
… puts “hi”
… end
… end
=> nil

f = Foo.new
=> #Foo:0x000005c

d = Doer.new
=> #Doer:0x000005e

f.Bar(d)
hi
=> nil

From: removed_email_address@domain.invalid
[mailto:removed_email_address@domain.invalid] On Behalf Of Tomas M.
Sent: Monday, February 09, 2009 5:46 PM
To: removed_email_address@domain.invalid
Subject: Re: [Ironruby-core] How to implement a C# interface from Ruby ?

You need to call the method from C# to check whether it is actually
bound to the CLR interface implementation. The method will always be
callable from Ruby.

Tomas

From: removed_email_address@domain.invalid
[mailto:removed_email_address@domain.invalid] On Behalf Of Jimmy
Schementi
Sent: Monday, February 09, 2009 5:43 PM
To: removed_email_address@domain.invalid
Subject: Re: [Ironruby-core] How to implement a C# interface from Ruby ?

How does it fail? Nothing fails for me, but how are you trying to use
this Ruby class?

(test.cs has your c# code in it):

C:\dev>csc.exe /t:library test.cs
Microsoft ® Visual C# 2008 Compiler version 3.5.30729.715
for Microsoft ® .NET Framework version 3.5
Copyright © Microsoft Corporation. All rights reserved.

C:\dev>ir
IronRuby 1.0.0.0 on .NET 2.0.50727.3521
Copyright © Microsoft Corporation. All rights reserved.

require ‘test.dll’
=> true

class Doer
… include IDoSomething
… def hello_world
… puts “hello”
… end
… end
=> nil

Doer
=> Doer

Doer.new
=> #Doer:0x000005c

Doer.new.hello_world
hello
=> nil

~js

From: removed_email_address@domain.invalid
[mailto:removed_email_address@domain.invalid] On Behalf Of Thibaut
Barrère
Sent: Monday, February 09, 2009 5:23 PM
To: ironruby-core
Subject: [Ironruby-core] How to implement a C# interface from Ruby ?

Hello again,

I’m playing around with the idea of using IronRuby to implement plugins
for a C#-based system (namely, CruiseControl.Net).

I’m having some difficulties trying to figure out what the correct
syntax for that would be. I’m currently using this to bootstrap the
engine:

                              var reader = new 

StreamReader(“plugin.rb”);
var code = reader.ReadToEnd();
reader.Close();

                              var engine = 

IronRuby.Ruby.CreateEngine();
engine.Execute(code);

The code inside plugin.rb is trying to implement an existing C#
interface:

      public interface IDoSomething {
                  void HelloWorld();
      }

I tried:

class Doer
include IDoSomething

def hello_world
puts “hello”
end
end

but it fails. What would be the correct syntax for a Ruby class to
implement this ?

thanks!

– Thibaut


#7

Hi guys,
thanks for all the suggestions.

Ah, me = dummy. You have that interface in C#, and the IronRuby code you’re
hosting can’t see the interface. This should expose all the types in the
current assembly:

engine.Runtime.LoadAssembly(GetType().Assembly);

That’s what was missing! Thank you…

I’ll have a closer look at the hosting tests, I guess this was probably
in
there already.

thanks!

– Thibaut