Delphi应用程序的插件系统 - bpl vs dll?

mig*_*jek 23 delphi dll plugins bpl

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

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

  2. 如果,让我们说,其中一个插件开发人员决定使用一些众所周知的单元(如synapse),默认情况下没有运行时包,第二个插件开发人员也会这样做,而不是碰撞 ...它在这里崩溃了. ..

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

提前致谢

ska*_*adt 17

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

如果您选择此方法,请帮自己一个忙,然后从一个简单的界面开始,然后在其上添加新的界面.您不希望更改基本界面,因此请保持简单和甜蜜.


Mar*_*ort 9

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

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

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

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

第三种选择是使用DLL,但是命名为Sharemem.字符串将工作,多个Delphi版本将工作.对象可以工作但不安全(例如我猜,例如D2009与早期版本不起作用).甚至其他语言用户也许可以通过COM进行分配,而不是完全排除非Delphi.