23

我正在编写 delphi 应用程序,它应该具有加载插件的能力。我正在使用 JvPluginManager 作为插件系统/管理器;)现在,在新的插件向导中,他们说最好使用 .bpl 类型的插件而不是 .dll 插件......这个解决方案与 dll 类型的插件相比有什么优点?到目前为止,我只发现了这个解决方案的缺点:

  1. 我必须将所有通用接口单元放在单独的包中,以便在加载插件时不会对包含通用单元的其他包抛出任何错误

  2. 如果,假设一个插件开发人员决定使用一些众所周知的单元(如突触),默认情况下没有运行时包,而第二个插件开发人员也这样做,而不是碰撞……它在这里崩溃了。 ..

那么,使用 bpls 而不是使用运行时包编译的 dll 实际上有什么优点呢?

提前致谢

4

5 回答 5

18

BPL 的另一个缺点。当您切换 Delphi 版本时,您将不得不重新分发新插件。经过多次尝试寻找完美的插件系统,我最终选择了 COM,我从未后悔过这个决定。在一个有插件需求超过 8 年的商业应用程序中,该应用程序继续向前发展,但在第一次迭代中发布的一些插件仍然以其原始形式存在。

如果您选择此方法,请帮自己一个忙,从一个简单的界面开始,然后在其上添加新界面。你不想改变你的基本界面,所以保持简单和甜蜜。

于 2009-07-28T15:49:08.240 回答
9

正如 Alexander 所说,BPL 基本上是一个 DLL。但是有一些条件(来自我所做的不那么简短的总结:http ://wiki.freepascal.org/packages ):

  • 一个单元在 BPL 的 +Exe 中只能存在一次。这避免了状态的重复(两次堆管理器和系统的其他全局变量等,VMT 表等)
  • .BPL 只能使用其他 .BPL。
  • 这意味着像 ansistring 和 IS/AS 这样的动态类型可以在 BPL 接口上正常工作。
  • 初始化/终结是单独的过程,并且它们的初始化顺序受到严格控制。对于静态动态加载,这更简单,对于动态加载(类似插件),检查所有对单元的依赖。
  • 一切本质上都是一个大程序,这意味着 BPL 必须使用相同的编译器版本和 RTL 进行编译,并且依赖于其他依赖项的版本。由于 Delphi 版本必须匹配,因此将 .BPL 插入现有的 EXE 可能更难。
  • 这也意味着您必须为插件 .BPL 所依赖的(非 Delphi).BPL 提供 .dcp

简而言之:如果插件架构是开放的,则将其设为 DLL。否则人们必须拥有完全相同的 Delphi 版本才能编写插件。

混合也是可能的。一个更高级别的 .BPL 接口,用于将您自己和选定的开发人员分解为 .BPL 的功能,以及用于其余部分的底层程序 DLL 接口。

第三种选择是使用 DLL,但使用 Sharemem。字符串可以工作,多个 Delphi 版本都可以工作。对象可以工作,但不安全(例如,我猜想,较早版本的 D2009 将无法工作)。甚至其他语言用户也可以通过 COM 进行分配,不完全排除非 Delphi。

于 2009-07-28T10:18:37.653 回答
4

你的第一个骗子也是专业人士。如果您在每个 dll 中复制共享代码,则 dll 会变得越来越大。即使在使用 dll 时,您也可以通过将共享代码移动到单独的 dll 中来防止这种情况。

优点:

  1. 类型是共享的。没有 TFont 不是 TFont 问题
  2. 内存管理器是共享的。字符串和类可以毫无问题地用作插件之间的参数。

缺点:

  1. 插件只能使用 Delphi 或 BCB 构建。
  2. 插件应该使用相同的 Delphi 或 BCB 版本。

你考虑过使用 COM 吗?COM 使得共享类型、字符串和类成为可能,并且插件可以用多种编程语言编写。

于 2009-07-28T08:50:51.793 回答
3

我不熟悉 JvPluginManager,但这取决于您将如何使用 BPL。

基本上,BPL - 只是一个普通的 DLL,但它的初始化/终结工作从 DllMain 剥离到单独的函数:'Initialize'/'Finalize'。

因此,如果您要像通常的 DLL 一样使用 BPL,我知道没有缺点,只有优点:DllMain 将不再有麻烦。就这样。唯一的区别。

但是 Delphi 中的 BPL 也提供了一种方便的代码共享方式。这意味着很大的优势(通用内存管理器、无重复代码等)。所以通常的 BPL 不仅仅是“作为一个 DLL”。但这也意味着,现在您的插件系统仅限于 Delphi(好吧,也可能是 C++ Builder)。即插件和exe都必须在同一个编译器中编译才能顺利运行。

如果这对您来说是可以接受的(即没有 MS Visual Studio,不,先生,从不) - 然后继续,您可以使用 BPL 的所有功能。

PS 但是升级这样的 BPLs 插件也是一场噩梦,如果你不仔细设计界面。在某些最坏的情况下,您可能需要重新编译所有内容。PPS 就像我说的:我不知道它是如何应用于由 JvPluginManager 创建的插件的。

于 2009-07-28T08:52:05.223 回答
1

避免使用 blp 方法,因为您必须随软件一起运送一大包 bpl,因此分发会变得庞大。

为什么我们使用 Delphi 来编译小型独立程序,这些程序可以在任何地方运行而没有任何运行时依赖。使用 bpls 意味着违背这个目的。

我不知道您对 DLL 是否满意,但我建议您使用 DLL。

  • 这将使其他开发人员(可能对您的软件感兴趣)有机会使用任何开发语言(只要该语言可以吐出 dll)来编写可以在您开发的软件中使用的自己的插件。
  • 另一件事是,你将从 Delphi 的 vcl 版本依赖暴政中解脱出来。迄今为止,德尔福的一个主要弱点。
于 2009-07-30T07:37:55.477 回答