5

例如,如何将方法的主体存储在数据库中并稍后运行它?(我正在使用 Delphi XE2;也许 RTTI 会有所帮助。)

4

2 回答 2

6

RTTI 不是一个完整的语言解释器。Delphi 是一种编译语言。您编写、编译并仅分发您的二进制文件。除非您是 Embarcadero,否则您无权分发 DCC32(命令行编译器)。

然而,JVCL包含一个类似于 delphi 的语言子集,封装在一个非常易于使用的组件中,称为“JvInterpreter”。您可以编写一些代码(如帕斯卡)并将其放入数据库中。然后,您可以从数据库中“运行该代码”(解释,而不是编译)。通常,这些应该是调用代码中方法的过程。您必须编写一些“包装器”来公开您希望向解释器公开的已编译 API(提供对实时数据、数据库连接对象或表/查询对象的访问)。你认为这听起来很完美,对吧?嗯,这是一个陷阱。

当心称为“配置复杂性时钟”的东西。你刚到 9 点钟,那是许多痛苦和折磨的开始。就像当您遇到问题时,您使用正则表达式解决它,“现在您有两个问题”,将脚本和 DSL 添加到您的应用程序可以解决一个问题并创建多个其他问题。

虽然我认为“将 DLL 存储在数据库 blob 字段中”的想法是邪恶且荒谬的,但我认为在应用程序中肆意添加脚本和特定领域的语言也会带来很多痛苦。首先问问自己其他更简单的解决方案是否可行。然后应用 YAGNI 原则(You Ain't Gonna Need It)和 KISS(keep-it-simple-smartguy)。

在您实施任何类似于您在问题中要求做的事情之前,请三思而后行。

于 2012-06-04T12:32:48.490 回答
2

恕我直言,您最好的选择是使用脚本引擎并将脚本存储在数据库中。

或者,您可以将代码放入 dll 中,然后将该 dll 放入数据库中。有用于将 dll 从资源加载到 ram 并对其进行处理的代码,以便可以像使用 LoadLibrary 加载一样使用它,例如在 dzlib 中。我真的不知道是否适用于任何 dll 以及在哪些版本的 Windows 中,但它适用于我尝试过的那些。

于 2012-06-04T11:39:16.900 回答