Я написал пакет SharpByte.Dynamic , чтобы упростить задачу динамической компиляции и выполнения кода. Код может быть вызван для любого объекта контекста с использованием методов расширения, как описано далее здесь .
Например,
someObject.Evaluate<int>("6 / {{{0}}}", 3))
возвращает 3;
someObject.Evaluate("this.ToString()"))
возвращает строковое представление объекта контекста;
someObject.Execute(@
"Console.WriteLine(""Hello, world!"");
Console.WriteLine(""This demonstrates running a simple script"");
");
запускает эти операторы как скрипт и т. Д.
Исполняемые файлы можно легко получить с помощью заводского метода, как показано в примере здесь - все, что вам нужно, это исходный код и список любых ожидаемых именованных параметров (токены встраиваются с использованием тройной скобки , например, {{{0}}}, чтобы избежать коллизий с string.Format (), а также синтаксисами, подобными Handlebars):
IExecutable executable = ExecutableFactory.Default.GetExecutable(executableType, sourceCode, parameterNames, addedNamespaces);
Каждый исполняемый объект (сценарий или выражение) является поточно-ориентированным, может храниться и использоваться повторно, поддерживает ведение журнала изнутри сценария, сохраняет информацию о времени и последнее исключение, если оно встречается, и т. Д. Существует также метод Copy (), скомпилированный каждый позволяет создавать дешевые копии, то есть использовать исполняемый объект, скомпилированный из сценария или выражения, в качестве шаблона для создания других.
Затраты на выполнение уже скомпилированного скрипта или оператора сравнительно невелики и составляют менее микросекунды на скромном оборудовании, а уже скомпилированные скрипты и выражения кэшируются для повторного использования.