Загрузка предварительно скомпилированного скрипта в Remobjects Pascal Script (Delphi)
Я пытаюсь загрузить предварительно выполненный сценарий RemObjects Pascal в Delphi во время выполнения.
Однако, когда я пытаюсь загрузить его Delphi excepts с " не может импортировать VALUE_TEAMCODE.'Value_TeamCode
- это функция в моем приложении Delphi, которую я уже зарегистрировал в Pascal Script.
вот что я делаю. Грубый псевдо-код ниже-фактический код разделен на несколько файлов. Также SetCompiled
вызов ниже происходит намного позже в приложении, когда сценарий требуется для запуска.
Примечание. относительно кода:
FPascalScript
- это TPSScriptDebugger
...
//Register custom functions with Pascal Script
FuncsRegister;
//Load script
FPascalScript.Script.AddStrings(AContent);
//Compile script
FPascalScript.Compile;
//Get compiled script
FPascalScript.GetCompiled(sCompiledScript)
//Try and set script back in - ERROR Here 'Cannot Import VALUE_TEAMCODE'
FPascalScript.PascalScript.Debugger.SetCompiled(sCompiledScript);
...
может быть, я собираюсь об этом неправильно. Я не уверен, что даже возможно загрузить предварительно скомпилированный скрипт.
Я искал на сайте RemObjects Wiki, но справка по скрипту Pascal удалена. Я также искал различные темы здесь, в StackOverflow, но ни один из них не связан с этой проблемой.
просто еще одна заметка. У меня уже есть скрипты, которые компилируются и выполняются во время выполнения без проблем. Мне нужно предварительно скомпилировать из соображений производительности.
любая помощь ценится.
обновление:
текущая работа заключается в том, чтобы иметь один движок скрипта на скрипт в моей системе. Эти двигатели остаются в памяти после предварительной компиляции. Это удаляет 30МС в компиляции скрипта накладные у меня иначе. Он также использует немного больше памяти, но недостаточно, чтобы быть проблемой.
Я все равно предпочел бы использовать только один движок скрипта.(Следовательно, необходимо загрузить предварительно скомпилированный скрипт)
2 ответов
благодаря ответу на RemObject Connect beta forum у меня есть решение. (Для сообщения см. http://connect.remobjects.com/discussion/comment/13540#Comment_13540)
спасибо перейти к плакату vovanl.
мне пришлось импортировать мои функции через событие OnExecImport следующим образом:
...
FPascalScript.OnExecImport := OnExecImport;
FPascalScript.SetCompiled(sCompiledScript);
...
TMyClass.OnExecImport(Sender: TObject; se: TPSExec; x: TPSRuntimeClassImporter);
begin
se.RegisterDelphiFunction(@Value_TeamCode, 'Value_TeamCode', cdRegister);
end;
...
похоже, SetCompiled очищает все существующие регистрации, и поэтому вы должны подключить OnExecImport для перерегистрации функций, процедур, методов и т. д.
обратите внимание, что загрузка предварительно скомпилированного скрипта (т. е. изменение одного скрипта на другой), похоже, добавляет дополнительные временные затраты. Я обнаружил, что моя первоначальная работа на самом деле быстрее примерно в 6 раз.
вместо того, как это, я собираюсь противостоять почему?
скомпилированные скрипты, вероятно, будут привязаны к версии, возможно, даже к платформе / цели - и они обычно компилируются достаточно быстро, чтобы вы никогда не замечали время удара. Вы действительно используете скрипты достаточно интенсивно, чтобы время компиляции было проблемой?
Иногда лучший ответ: "вам действительно нужно это делать?"