Eu escrevi um pacote, SharpByte.Dynamic , para simplificar a tarefa de compilar e executar código dinamicamente. O código pode ser chamado em qualquer objeto de contexto usando métodos de extensão, conforme detalhado mais aqui .
Por exemplo,
someObject.Evaluate<int>("6 / {{{0}}}", 3))
retorna 3;
someObject.Evaluate("this.ToString()"))
retorna a representação de string do objeto de contexto;
someObject.Execute(@
"Console.WriteLine(""Hello, world!"");
Console.WriteLine(""This demonstrates running a simple script"");
");
executa essas instruções como um script, etc.
Os executáveis podem ser obtidos facilmente usando um método de fábrica, como visto no exemplo aqui - tudo que você precisa é o código-fonte e a lista de quaisquer parâmetros nomeados esperados (os tokens são incorporados usando a notação de colchetes triplos, como {{{0}} }, para evitar colisões com string.Format (), bem como sintaxes semelhantes a Handlebars):
IExecutable executable = ExecutableFactory.Default.GetExecutable(executableType, sourceCode, parameterNames, addedNamespaces);
Cada objeto executável (script ou expressão) é thread-safe, pode ser armazenado e reutilizado, suporta registro de dentro de um script, armazena informações de tempo e última exceção se encontrada, etc. Há também um método Copy () compilado em cada um para permitir criar cópias baratas, ou seja, usar um objeto executável compilado de um script ou expressão como modelo para criar outros.
A sobrecarga de execução de um script ou instrução já compilado é relativamente baixa, menos de um microssegundo em um hardware modesto, e os scripts e expressões já compilados são armazenados em cache para reutilização.