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

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

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

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

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

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


person migajek    schedule 28.07.2009    source источник


Ответы (5)


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

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

person skamradt    schedule 28.07.2009
comment
Не могли бы вы предоставить дополнительную информацию о том, как вы реализовали архитектуру плагинов на основе COM? - person Nick Hodges; 26.01.2012
comment
Основная предпосылка - создать общий интерфейс, а затем создать объекты автоматизации com, реализующие этот интерфейс. Родительская программа вызывает определенный объект автоматизации com, который требуется для требуемого поведения. Я вел отдельный поиск доступных плагинов и уникального идентификатора класса, необходимого для вызова каждого конкретного из них. Guid класса предназначался для отдельного объекта автоматизации, который ТАКЖЕ реализовал общий интерфейс плагина. - person skamradt; 27.01.2012

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

  • Юнит может существовать только один раз в BPL's + Exe. Это позволяет избежать дублирования состояния (в два раза больше диспетчера кучи и других глобальных переменных системы и т. Д., Таблиц 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.

person Marco van de Voort    schedule 28.07.2009

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

Плюсы:

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

Минусы:

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

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

person Lars Truijens    schedule 28.07.2009
comment
Диспетчер памяти (отсутствие TFont не является ошибкой TFont;)) также используется, если вы компилируете как все библиотеки DLL плагинов, так и приложение с базовыми пакетами времени выполнения, такими как rtl и vcl ... так что это не главное. Мои плагины на самом деле не имеют общего кода, общие модули содержат только определения интерфейсов ... так что это только библиотеки DLL, скомпилированные с общими плагинами bpls и bpl;) - person migajek; 28.07.2009
comment
Вы правы, собирая библиотеки DLL с пакетами времени выполнения. Зато у dll такие же минусы :) - person Lars Truijens; 28.07.2009
comment
Я не уверен, но я думаю, что Microsoft не поддерживает технологии COM и DCOM. - person Francis Lee; 28.07.2009
comment
Да, afaik в пользу COM +, на котором основан .NET и который в значительной степени совместим с ними. - person Marco van de Voort; 29.07.2009
comment
Посмотрев на бета-версию Windows 7, я могу с уверенностью сказать, что COM все еще не обесценивается и не будет обесцениваться, поскольку все еще есть несколько частей Win, которые используют COM для внутренних целей. - person Yogi Yang 007; 30.07.2009

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

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

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

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

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

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

person Alex    schedule 28.07.2009
comment
Я уже решил отказаться от возможности использования любого другого языка, кроме delphi, потому что мои интерфейсы используют некоторые типы, специфичные для Delphi (например, TForm;)) Написание интерфейсов обертывания даже для этих самых базовых объектов займет у меня слишком много времени ... - person migajek; 28.07.2009
comment
Обратите внимание на версию Delphi. И, возможно, только версии Rad Studio (с BCB и Delphi в одной версии?) Могут работать. Вероятно, им придется, поскольку пакеты основаны на .BPL. - person Marco van de Voort; 28.07.2009

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

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

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

  • Это даст другим разработчикам (которые могут заинтересоваться вашим программным обеспечением) возможность использовать любой язык разработки (при условии, что этот язык может выдавать dll) для написания своих собственных подключаемых модулей, которые могут быть использованы в разработанном вами программном обеспечении.
  • Другое дело, что вы будете избавлены от тирании зависимостей версий vcl в Delphi. Основное слабое место Delphi на сегодняшний день.
person Yogi Yang 007    schedule 30.07.2009
comment
Я решил использовать DLL, так как есть запланированная возможность предоставления плагином некоторых функций другим плагинам - таким образом, если второй плагин установлен, первый может использовать его функции. В противном случае он не дает сбоя, но не имеет расширенных возможностей. В любом случае это будет означать компиляцию обоих пакетов с общим пакетом интерфейса, что приведет к тому, что он не будет работать, если он отсутствует. Не имеет смысла. Я уже решил, что нет возможности писать в других средах (не VCL), так как я не могу писать оболочки для таких базовых классов, как TForm и так далее ... - person migajek; 31.07.2009