Загрузка предварительно скомпилированного скрипта в 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 раз.


вместо того, как это, я собираюсь противостоять почему?

скомпилированные скрипты, вероятно, будут привязаны к версии, возможно, даже к платформе / цели - и они обычно компилируются достаточно быстро, чтобы вы никогда не замечали время удара. Вы действительно используете скрипты достаточно интенсивно, чтобы время компиляции было проблемой?

Иногда лучший ответ: "вам действительно нужно это делать?"