2010-05-27 7 views
8

Je souhaite utiliser IronRuby comme langage de script (comme Lua, par exemple) dans mon projet .NET. Par exemple, je veux pouvoir m'abonner à partir d'un script Ruby à des événements spécifiques, déclencher dans l'application hôte et appeler les méthodes Ruby à partir de celle-ci.IronRuby comme langage de script dans .NET

J'utilise ce code pour instancier le moteur IronRuby:

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

index.rb Supposant contient:

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

Comment puis-je:

  1. Marque C# méthode Abonnez-vous (défini dans l'application hôte) visible depuis index.rb?
  2. Appeler plus tard gestionnaire méthode de l'application hôte?

Répondre

7

Vous pouvez simplement utiliser les événements .NET et vous y abonner au sein de votre code IronRuby. Par exemple, si vous avez le prochain événement dans votre code C#:

public class Demo 
{ 
    public event EventHandler SomeEvent; 
} 

Puis, en IronRuby vous pouvez vous abonner comme suit:

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

Pour rendre votre classe .NET disponible dans votre code Ruby , utilisez un ScriptScope et ajoutez votre classe (this) comme une variable et accéder à partir de votre code Ruby:

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

et puis de Ruby:

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

Pour avoir la classe de démonstration disponible dans le code Ruby afin que vous puissiez l'initialiser (Demo.new), vous devez faire l'assemblage « découvrable » par IronRuby. Si l'ensemble est pas dans le GAC puis ajoutez le répertoire d'assemblage aux chemins de recherche de IronRuby:

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

Puis dans votre code IronRuby vous pouvez exiger l'assemblage, par exemple: require "DemoAssembly.dll" puis il suffit d'utiliser comme vous le voulez.

+1

Merci beaucoup. Mais une question demeure. Comment rendre disponible la classe Demo (pas l'instance) dans le code ruby ​​de telle sorte que nous serions en mesure de l'instancier? Par exemple: d = Demo.new – rubyist111

+0

Ajout de la réponse au corps de la réponse originale ci-dessus. –

+0

Avec le dernier IronRuby (1.13, je crois), vous obtenez une collection de taille fixe pour 'searchPaths', ce qui déclenche une exception si vous essayez d'y ajouter. Vous devez créer votre propre collection à la place et copier les valeurs. – ashes999