Система плагинов для приложения Delphi - bpl vs dll?

Я пишу приложение Delphi, которое должно иметь возможность загрузки плагинов. Я использую JvPluginManager в качестве системы / менеджера плагинов;) Теперь в новом мастере плагинов говорят, что лучше использовать плагины типа.bpl вместо плагинов.dll... Каковы плюсы этого решения по сравнению с плагинами типа dll? Пока что я нашел только минусы этого решения:

  1. Я должен поместить все общие интерфейсные модули в отдельный пакет, чтобы при загрузке плагинов не возникало никаких ошибок в отношении другого пакета, содержащего общий модуль

  2. если, скажем, один из разработчиков плагинов решит использовать какой-то известный модуль (например, synapse), который по умолчанию не имеет пакета времени исполнения, а второй разработчик плагинов делает то же самое, что и bump... здесь происходит сбой...

Итак, каковы преимущества использования bpls вместо dll, скомпилированных с пакетами времени выполнения?

заранее спасибо

5 ответов

Решение

Еще один недостаток BPL. При переключении версий Delphi вам придется повторно распространять новые плагины. После многих попыток найти идеальную систему плагинов я получил COM и никогда не сожалел об этом решении. В коммерческом приложении, для которого требовалось наличие плагинов более 8 лет, приложение продолжало двигаться вперед, и все же некоторые из плагинов, выпущенных с первой итерацией, все еще существуют в их ОРИГИНАЛЬНОЙ форме.

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

Как сказал Александр, BPL - это в основном DLL. Но есть некоторые условия (из краткого резюме, которое я сделал: http://wiki.freepascal.org/packages):

  • Единица может существовать только один раз в BPL +Exe. Это позволяет избежать дублирования состояния (вдвое больше heapmanager и других глобальных переменных системы и т. Д., Таблиц VMT и т. Д.)
  • .BPL могут использовать только другие.BPL.
  • Это означает, что динамические типы, такие как ansistring и IS/AS, работают должным образом через интерфейсы BPL.
  • Инициализация / завершение - это отдельная процедура, и порядок их инициализации строго контролируется. Для статической динамической загрузки это проще, для динамической загрузки (подобной плагину) проверяются все зависимости от модулей.
  • Все по сути является одной большой программой, что означает, что BPL должны быть скомпилированы с той же версией компилятора и RTL и зависят от версий и других зависимостей. Возможно, будет сложнее создать.BPL для подключения к существующему EXE-файлу, поскольку версия Delphi должна совпадать.
  • Это также означает, что вы должны предоставить.dcp для (не Delphi) .BPLs плагин.BPLs зависят от

Вкратце: если архитектура плагина открыта, сделайте ее DLL. В противном случае люди должны иметь точно такую ​​же версию Delphi, чтобы писать плагины.

Гибрид также возможен. Интерфейс.BPL более высокого уровня для функциональности, которую вы сами выделяете в.BPL и выбранных разработках, и остальной интерфейс DLL для процедур.

Третий вариант - использование библиотек DLL, но они предназначены для Sharemem. Строки будут работать, несколько версий Delphi будут работать. Объекты могут работать, но небезопасны (например, я думаю, например, D2009 с более ранней версией не будет работать). Даже пользователи других языков могут иметь возможность выделять через COM, не полностью исключая не Delphi.

Ваш первый мошенник тоже профессионал. Если вы реплицируете общий код в каждой dll, dll становится все больше и больше. Даже при использовании dll вы можете предотвратить это, переместив общий код в отдельную dll.

Плюсы:

  1. Типы являются общими. Нет TFont не является проблемой TFont
  2. Диспетчер памяти является общим. Строки и классы могут быть использованы в качестве параметра между плагинами без проблем.

Минусы:

  1. Плагины могут быть построены только с использованием Delphi или BCB.
  2. Плагины должны использовать ту же версию Delphi или BCB.

Вы рассматривали возможность использования COM? COM позволяет обмениваться типами, строками и классами, а плагины могут быть написаны на многих языках программирования.

Я не знаком с JvPluginManager, но это зависит от того, как вы собираетесь использовать BPL.

По сути, BPL - это просто обычная DLL, но ее работа по инициализации / финализации отделена от DllMain до отдельных функций: "Initialize" / "Finalize".

Итак, если вы собираетесь использовать BPL как обычную DLL, я не знаю о минусах, а только о плюсах: с DllMain проблем больше не будет. Это все. Единственная разница.

Но BPL в Delphi также предоставляет удобный способ обмена кодом. Это означает большие преимущества (общий менеджер памяти, отсутствие дублированного кода и т. Д. И т. Д.). Так что обычный BPL делает гораздо больше, чем просто быть DLL. Но это также означает, что теперь ваша система плагинов ограничена только Delphi (ну, может быть, C++ Builder тоже). Т.е. оба плагина и exe ДОЛЖНЫ быть скомпилированы в одном и том же компиляторе для бесперебойной работы.

Если это приемлемо для вас (то есть, нет MS Visual Studio, нет, сэр, никогда), - тогда вы можете использовать все возможности BPL.

PS Но обновление таких плагинов BPL также может быть кошмаром, если вы не будете тщательно разрабатывать интерфейс. В некоторых худших случаях вам может понадобиться все перекомпилировать. PPS Как я уже сказал: я понятия не имею, как это применяется к плагинам, созданным JvPluginManager.

Избегайте подхода blp, так как вам придется доставлять большой пакет bpl с вашим программным обеспечением, и, следовательно, распространение станет громоздким.

почему мы используем Delphi для компиляции небольших автономных программ, которые просто запускаются где угодно без какой-либо зависимости во время выполнения. Использование bpls означает победу над этой целью.

Я не знаю, насколько вам удобно с DLL, но я бы посоветовал вам использовать DLL.

  • Это даст другим разработчикам (которые могут заинтересоваться вашим программным обеспечением) возможность использовать любой язык разработки (если этот язык может выплевывать dll) для написания своих собственных плагинов, которые могут использоваться в вашем разработанном программном обеспечении.
  • Другое дело, что вы будете спасены от тирании зависимости от версии Delphi vcl. Главное слабое место Delphi до настоящего времени.
Другие вопросы по тегам