2010-05-27 9 views
8

Quiero utilizar IronRuby como lenguaje de scripting (como Lua, por ejemplo) en mi proyecto .NET. Por ejemplo, deseo poder suscribirme desde un script de Ruby a eventos específicos, activarlo en la aplicación de host y llamar a los métodos de Ruby.IronRuby como lenguaje de scripting en .NET

Estoy usando este código para instanciar el motor IronRuby:

Dim engine = Ruby.CreateEngine() 
Dim source = engine.CreateScriptSourceFromFile("index.rb").Compile() 
' Execute it 
source.Execute() 

Suponiendo index.rb contiene:

subscribe("ButtonClick", handler) 
def handler 
    puts "Hello there" 
end 

Cómo hacer yo:

  1. Make C# método Suscribirse (definido en la aplicación de host) visible desde index.rb?
  2. Invocar más tarde manipulador método desde la aplicación host?

Respuesta

7

Puede simplemente utilizar eventos .NET y suscribirse a ellos con su código IronRuby. Por ejemplo, si usted tiene el siguiente evento en su código C#:

public class Demo 
{ 
    public event EventHandler SomeEvent; 
} 

Luego, en IronRuby que puede suscribirse a él de la siguiente manera:

d = Demo.new 
d.some_event do |sender, args| 
    puts "Hello there" 
end 

Para que su clase de .NET disponible dentro de su código Ruby , use un ScriptScope y añadir su clase (this) como una variable y acceder a él desde dentro de su código Ruby:

ScriptScope scope = runtime.CreateScope(); 
scope.SetVariable("my_class",this); 
source.Execute(scope); 

y luego desde Ruby:

self.my_class.some_event do |sender, args| 
    puts "Hello there" 
end 

Para tener la clase de demostración disponible dentro del código Ruby para que pueda inicializarlo (Demo.new), es necesario realizar el montaje "detectar" el IronRuby. Si el conjunto no está en la GAC ​​a continuación, añadir el directorio de montaje para las rutas de búsqueda de IronRuby:

var searchPaths = engine.GetSearchPaths(); 
searchPaths.Add(@"C:\My\Assembly\Path"); 
engine.SetSearchPaths(searchPaths); 

Luego, en el código de IronRuby que puede requerir el montaje, por ejemplo: require "DemoAssembly.dll" y luego sólo tiene que utilizar como quiera.

+1

Muchas gracias. Pero queda una pregunta. ¿Cómo poner a disposición una clase de demostración (no instancia) dentro del código Ruby de forma tal que podamos instanciarla? Por ejemplo: d = Demo.new – rubyist111

+0

Agregó la respuesta al cuerpo de la respuesta original anterior. –

+0

Con el último IronRuby (1.13, creo), se obtiene una colección de tamaño fijo para 'searchPaths', que arroja una excepción si intentas agregar algo. En su lugar, debe crear su propia colección y copiar los valores. – ashes999

Cuestiones relacionadas