Escribí un paquete, SharpByte.Dynamic , para simplificar la tarea de compilar y ejecutar código dinámicamente. El código se puede invocar en cualquier objeto de contexto utilizando métodos de extensión como se detalla más aquí .
Por ejemplo,
someObject.Evaluate<int>("6 / {{{0}}}", 3))
devuelve 3;
someObject.Evaluate("this.ToString()"))
devuelve la representación de cadena del objeto de contexto;
someObject.Execute(@
"Console.WriteLine(""Hello, world!"");
Console.WriteLine(""This demonstrates running a simple script"");
");
ejecuta esas declaraciones como un script, etc.
Los ejecutables se pueden obtener fácilmente usando un método de fábrica, como se ve en el ejemplo aquí; todo lo que necesita es el código fuente y la lista de los parámetros con nombre esperados (los tokens se incrustan usando la notación de tres corchetes, como {{{0}} }, para evitar colisiones con string.Format () así como sintaxis similares a Handlebars):
IExecutable executable = ExecutableFactory.Default.GetExecutable(executableType, sourceCode, parameterNames, addedNamespaces);
Cada objeto ejecutable (script o expresión) es seguro para subprocesos, se puede almacenar y reutilizar, admite el registro desde un script, almacena información de tiempo y la última excepción si se encuentra, etc. También hay un método Copy () compilado en cada uno para permitir crear copias baratas, es decir, utilizar un objeto ejecutable compilado a partir de un script o expresión como plantilla para crear otros.
La sobrecarga de ejecutar una secuencia de comandos o una declaración ya compilada es relativamente baja, muy por debajo de un microsegundo en un hardware modesto, y las secuencias de comandos y expresiones ya compiladas se almacenan en caché para su reutilización.