Я написал пакет 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 (), скомпилированный для каждого, чтобы разрешить создание дешевых копий, т.е. использование исполняемого объекта, скомпилированного из сценария или выражения, в качестве шаблона для создания других.
Накладные расходы на выполнение уже скомпилированного сценария или оператора относительно невелики, менее микросекунды на скромном оборудовании, а уже скомпилированные сценарии и выражения кэшируются для повторного использования.