Ho scritto un pacchetto, SharpByte.Dynamic , per semplificare il compito di compilare ed eseguire il codice in modo dinamico. Il codice può essere richiamato su qualsiasi oggetto di contesto utilizzando i metodi di estensione come descritto in dettaglio qui .
Per esempio,
someObject.Evaluate<int>("6 / {{{0}}}", 3))
restituisce 3;
someObject.Evaluate("this.ToString()"))
restituisce la rappresentazione di stringa dell'oggetto contesto;
someObject.Execute(@
"Console.WriteLine(""Hello, world!"");
Console.WriteLine(""This demonstrates running a simple script"");
");
esegue queste istruzioni come script, ecc.
Gli eseguibili possono essere ottenuti facilmente utilizzando un metodo di fabbrica, come mostrato nell'esempio qui: tutto ciò di cui hai bisogno è il codice sorgente e l'elenco di tutti i parametri denominati previsti (i token sono incorporati utilizzando la notazione a tre parentesi, come {{{0}} }, per evitare collisioni con string.Format () e sintassi simili a Handlebars):
IExecutable executable = ExecutableFactory.Default.GetExecutable(executableType, sourceCode, parameterNames, addedNamespaces);
Ogni oggetto eseguibile (script o espressione) è thread-safe, può essere memorizzato e riutilizzato, supporta la registrazione dall'interno di uno script, memorizza le informazioni sui tempi e l'ultima eccezione se incontrata, ecc. C'è anche un metodo Copy () compilato su ciascuno per consentire creare copie economiche, ovvero utilizzare un oggetto eseguibile compilato da uno script o un'espressione come modello per crearne altri.
Il sovraccarico di esecuzione di uno script o di un'istruzione già compilati è relativamente basso, ben al di sotto di un microsecondo su hardware modesto, e gli script e le espressioni già compilati vengono memorizzati nella cache per il riutilizzo.