Ich habe ein Paket geschrieben, SharpByte.Dynamic , um das dynamische Kompilieren und Ausführen von Code zu vereinfachen. Der Code kann für jedes Kontextobjekt mit Erweiterungsmethoden aufgerufen werden, wie hier näher beschrieben .
Beispielsweise,
someObject.Evaluate<int>("6 / {{{0}}}", 3))
gibt 3 zurück;
someObject.Evaluate("this.ToString()"))
Gibt die Zeichenfolgendarstellung des Kontextobjekts zurück.
someObject.Execute(@
"Console.WriteLine(""Hello, world!"");
Console.WriteLine(""This demonstrates running a simple script"");
");
führt diese Anweisungen als Skript usw. aus.
Ausführbare Dateien können einfach mit einer Factory-Methode abgerufen werden, wie im Beispiel hier gezeigt. Sie benötigen lediglich den Quellcode und die Liste aller erwarteten benannten Parameter (Token werden in dreifacher Klammer wie {{{0}} eingebettet). }, um Kollisionen mit string.Format () sowie Lenker-ähnlichen Syntaxen zu vermeiden):
IExecutable executable = ExecutableFactory.Default.GetExecutable(executableType, sourceCode, parameterNames, addedNamespaces);
Jedes ausführbare Objekt (Skript oder Ausdruck) ist threadsicher, kann gespeichert und wiederverwendet werden, unterstützt die Protokollierung innerhalb eines Skripts, speichert Zeitinformationen und die letzte Ausnahme, falls diese auftreten usw. Außerdem wird für jedes Objekt eine Copy () -Methode kompiliert, um dies zu ermöglichen Erstellen billiger Kopien, dh Verwenden eines ausführbaren Objekts, das aus einem Skript oder Ausdruck kompiliert wurde, als Vorlage zum Erstellen anderer.
Der Aufwand für die Ausführung eines bereits kompilierten Skripts oder einer Anweisung ist relativ gering und liegt bei bescheidener Hardware deutlich unter einer Mikrosekunde. Bereits kompilierte Skripte und Ausdrücke werden zur Wiederverwendung zwischengespeichert.