Я провел некоторое тестирование @ digEmAll's кода.Сначала я должен сказать, что он работает правильно и делает то, что я спросил в вопросеНо меня беспокоил тот факт, что вам нужно вызывать
string expr = "functionOfMyModule()";
var result = engine.Execute(expr, scope);
каждый раз, когда вы хотите оценить пользовательское выражение.Меня беспокоило то, что код не был предварительно скомпилирован и должен обрабатываться при каждом выполнении, что может серьезно повлиять на производительность моего приложения (такие выражения можно вызывать сотни тысяч, если не миллионы раз, поэтомукаждая миллисекунда считается).
Я попробовал другое решение: просто вставил пользовательское выражение в конец модуля Python (я не говорю, что это работает во всех ситуациях!):
def simpleFunc(x):
return x + 2;
# this is where the pasting occurs:
simpleFunc(x)
Затем я скомпилировал этот код:
ScriptSource source = engine.CreateScriptSourceFromString(myCode);
CompiledCode compiledCode = source.Compile();
... создайте область и запустите ее:
ScriptScope scope = engine.CreateScope();
scope.SetVariable ("x", 10);
int result = compiledCode.Execute<int>(scope);
Теперь я выполнил оба решения (digEmAll имое) в одном и том же фрагменте кода и одном и том же выражении 10 000 раз, и вот результаты:
- engine.Execute (expr, scope): 0,29 мс / прогон
- compiledCode.Execute (scope): 0,01 мс / прогон
Так что я думаю, что я попытаюсь использовать свое собственное решение, если только вставка кода не будет проблемой.