Wenn man mit IronRuby Klassen definiert, oder auf vorhandene Ruby Klassen zugreifen möchte, muss man sowohl auf die ScriptRuntime.Globals Property, als auch auf die ScriptEngine.Operations Property zurückgreifen.
Globals
Die Globals Property der ScriptRuntime ist eine Instanz der ScriptScope Klasse, innerhalb diesem Scope befinden nicht die gewöhnlichen Variablen die man aus C# und in C# nutzen kann sondern Module und Klassen ohne Modulzugehörigkeit.
Operations
Die Operations Property der ScriptEngine erlaubt es, Aktionen im dynamischen Kontext auszuführen, hierbei können Instanzen erstellt, Properties abgefragt, gesetzt oder Methoden aufgerufen werden.
Ein einfaches Beispiel
Gerade für Scriptsprachen wie Ruby existieren viele fertige Code-Snippets im Web, die man recht einfach in vorhandene Anwendungen integrieren kann.
Als Beispielscript möchte ich einfach mal eine einfache Klassenhirachie nehmen
class Animal
def saySomething
end
end
class Cat < Animal
def saySomething
"Miau"
end
end
class Dog < Animal
def saySomething
"WauWau"
end
end
Dieses Beispielscript wir im folgenden Beispielcode aus der Datei “AnimalTree.rb” geladen und ausgeführt.
Hands on…
Ok, genug der Vorbereitung. Schauen wir uns das Sample einfach mal im C# Code an.
var engine = IronRuby.Ruby.CreateEngine();
var scope = engine.CreateScope();
engine.Execute("AnimalTree.rb", scope);
// load the classes
object catClass = engine.Runtime.Globals.GetVariable("Cat");
object dogClass = engine.Runtime.Globals.GetVariable("Dog");
// create some instances
object catInstance = engine.Operations.CreateInstance(catClass);
object dogInstance = engine.Operations.CreateInstance(dogClass);
// call the saySomething method and catch the result
object result = engine.Operations.InvokeMember(catInstance, "saySomething", new object[] { });
object dogResult = engine.Operations.InvokeMember(dogInstance, "saySomething", new object[] { });
// write the result to the console...
Console.WriteLine(result.ToString());
Console.WriteLine(dogResult.ToString());
Zunächst kommt die Standardpartie, die Engine und der Scope werden erstellt. Danach wird wie bereits erwähnt das Ruby-Script ausgeführt. Nach der Ausführung sind die Typen die innerhalb der DLR erstellt wurden im GlobalContext der Runtime vorhanden und können somit über die Globals Property abgefragt werden.
Im zweiten Schritt wird von jedem Typ eine Instanz erstellt, hierzu wird bereits auf die Operations Property der ScriptEngine zurückgegriffen. Natürlich gibt es für die Methoden wie CreateInstance auch Überladungen damit man Konstruktoren mit Parametern aufgerufen werden können.
Im dritten und letzten Schritt wird die InvokeMember Methode aufgerufen und der Rückgabewert der entsprechenden Methoden aus der DLR gefangen und schlussendlich auf der Console ausgegeben.
Mehr ist nicht notwendig um auf dynamische Typen zugreifen zu können.
Viel Spass beim Scripten
Technorati Tags:
DLR,
IronRuby