在RemObjects Pascal脚本(Delphi)中加载预编译脚本

在RemObjects Pascal脚本(Delphi)中加载预编译脚本,delphi,pascal,pascalscript,Delphi,Pascal,Pascalscript,我试图在运行时在Delphi中加载预编译的RemObjects Pascal脚本。 但是,当我尝试加载它时,Delphi例外情况是“无法导入值\u TEAMCODE”。VALUE\u TEAMCODE是我的Delphi应用程序中的一个函数,我已经用Pascal脚本注册了它 这就是我正在做的。下面是粗略的伪代码-实际代码被分割到多个文件中。此外,当需要运行脚本时,下面的SetCompiled调用会在应用程序中发生得更晚 关于代码的注释: FPascalScript是一个TPSScriptDebug

我试图在运行时在Delphi中加载预编译的RemObjects Pascal脚本。 但是,当我尝试加载它时,Delphi例外情况是“无法导入值\u TEAMCODE”。
VALUE\u TEAMCODE
是我的Delphi应用程序中的一个函数,我已经用Pascal脚本注册了它

这就是我正在做的。下面是粗略的伪代码-实际代码被分割到多个文件中。此外,当需要运行脚本时,下面的
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毫秒编译开销。它也会占用更多的内存,但不足以成为一个问题


尽管如此,我还是宁愿只使用一个脚本引擎(因此需要加载预编译脚本)

而不是如何使用它,我要反驳为什么

编译后的脚本可能会受到版本限制,甚至可能受到平台/目标的限制,而且它们的编译速度通常足够快,以至于您永远不会注意到时间问题。您是否真的非常频繁地使用脚本,以至于编译时间成为一个问题


有时候最好的答案是“你真的需要这么做吗?”

多亏ReObject Connect beta论坛上的回复,我有了一个解决方案。 (详情请参阅)

感谢大家来到海报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倍左右。

如果他在web服务器中使用它,并且编译脚本的加载速度比解析+编译过程快,那么即使它在IMO中达到5毫秒,也必须这样做。这不是答案。这是对原始问题的一个(好)评论,但它没有回答这里提出的问题。为什么是出于性能原因。我的应用程序时间紧迫,任何额外的开销加起来都很快。需要时编译需要30毫秒。我有20多个脚本正在编译。这需要600毫秒。不过,我现在有一个解决办法——基本上每个脚本都有一个脚本引擎对象,在预编译后会保留在内存中。这样我就不必加载脚本。使用更多内存,但不足以引起关注。不过,我宁愿只使用一个脚本引擎。还有一些想法:您的应用程序是否经常更改脚本,从而需要脚本编写所涉及的复杂性和时间代价?您是否考虑过像DelphiWebScript这样的替代方案?现在这是一个非常活跃的脚本项目,重点放在性能上,这可能更符合您的时间敏感要求。您确定已删除wiki/文档吗?在谷歌搜索“RemObjects Pascal脚本文档”时,我找到了一个。是的,我读过这些。不幸的是,他们更多地解释了脚本是如何工作的,以及如何注册类、方法等。不过我现在有一个解决办法——基本上每个脚本都有一个脚本引擎对象,在预编译后留在内存中。只是出于好奇。。是什么让你选择RO pascalscript而不是DWS?您会推荐它吗?由于旧代码的缘故,请使用RO PascalScript。