J'ai écrit un package, SharpByte.Dynamic , pour simplifier la tâche de compilation et d'exécution du code de manière dynamique. Le code peut être appelé sur n'importe quel objet de contexte en utilisant des méthodes d'extension comme détaillé plus loin ici .
Par exemple,
someObject.Evaluate<int>("6 / {{{0}}}", 3))
renvoie 3;
someObject.Evaluate("this.ToString()"))
renvoie la représentation sous forme de chaîne de l'objet de contexte;
someObject.Execute(@
"Console.WriteLine(""Hello, world!"");
Console.WriteLine(""This demonstrates running a simple script"");
");
exécute ces instructions sous forme de script, etc.
Les exécutables peuvent être obtenus facilement à l'aide d'une méthode de fabrique, comme le montre l'exemple ici - tout ce dont vous avez besoin est le code source et la liste de tous les paramètres nommés attendus (les jetons sont incorporés en utilisant une notation à trois crochets, telle que {{{0}}) }, pour éviter les collisions avec string.Format () ainsi que les syntaxes de type Handlebars):
IExecutable executable = ExecutableFactory.Default.GetExecutable(executableType, sourceCode, parameterNames, addedNamespaces);
Chaque objet exécutable (script ou expression) est thread-safe, peut être stocké et réutilisé, prend en charge la journalisation à partir d'un script, stocke les informations de synchronisation et la dernière exception si elle est rencontrée, etc. Il existe également une méthode Copy () compilée sur chacun pour permettre créer des copies bon marché, c'est-à-dire utiliser un objet exécutable compilé à partir d'un script ou d'une expression comme modèle pour en créer d'autres.
La surcharge liée à l'exécution d'un script ou d'une instruction déjà compilé est relativement faible, bien en dessous d'une microseconde sur du matériel modeste, et les scripts et expressions déjà compilés sont mis en cache pour être réutilisés.