Forum: IronRuby How to implement a C# interface from Ruby ?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Thibaut B. (Guest)
on 2009-02-10 03:33
(Received via mailing list)
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
Jimmy S. (Guest)
on 2009-02-10 03:43
(Received via mailing list)
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 (R) Visual C# 2008 Compiler version 3.5.30729.715
for Microsoft (R) .NET Framework version 3.5
Copyright (C) Microsoft Corporation. All rights reserved.

C:\dev>ir
IronRuby 1.0.0.0 on .NET 2.0.50727.3521
Copyright (c) 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
Tomas M. (Guest)
on 2009-02-10 04:37
(Received via mailing list)
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
Tomas M. (Guest)
on 2009-02-10 05:09
(Received via mailing list)
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 (R) Visual C# 2008 Compiler version 3.5.30729.715
for Microsoft (R) .NET Framework version 3.5
Copyright (C) Microsoft Corporation. All rights reserved.

C:\dev>ir
IronRuby 1.0.0.0 on .NET 2.0.50727.3521
Copyright (c) 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
Jimmy S. (Guest)
on 2009-02-10 05:35
(Received via mailing list)
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 (R) Visual C# 2008 Compiler version 3.5.30729.715
for Microsoft (R) .NET Framework version 3.5
Copyright (C) Microsoft Corporation. All rights reserved.

C:\dev>ir
IronRuby 1.0.0.0 on .NET 2.0.50727.3521
Copyright (c) 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
Jimmy S. (Guest)
on 2009-02-10 06:07
(Received via mailing list)
// 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 (c) 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 (R) Visual C# 2008 Compiler version 3.5.30729.715
for Microsoft (R) .NET Framework version 3.5
Copyright (C) Microsoft Corporation. All rights reserved.

C:\dev>ir
IronRuby 1.0.0.0 on .NET 2.0.50727.3521
Copyright (c) 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
Thibaut B. (Guest)
on 2009-02-10 13:30
(Received via mailing list)
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
This topic is locked and can not be replied to.