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