Я занимаюсь разработкой программного обеспечения, в котором ядро, плагины и графический интерфейс разделены модульно. Я загружаю модули динамически по требованию.
Мне нужно определить, какой тип взаимодействия лучше всего подходит для программного обеспечения, модульного таким образом, чтобы различные части могли обмениваться событиями и информацией, учитывая, что в конечном итоге сторонние разработчики будут разрабатывать плагины или графический интерфейс с использованием другого инструментария.
На данный момент я решил просто загрузить символы из общих объектов и работать с ними, зная их типы и сигнатуры функций. Я также рассмотрел возможность использования IPC, такого как DBus, но я не уверен, будет ли это излишним или совершенно ненужным.
Кроссплатформенность не так уж и важна сейчас, но это может произойти в будущем.
Каковы плюсы и минусы одного против другого? Есть ли другие решения для рассмотрения, о которых я не нашел?
IPC является избыточным для компонентов, загруженных в процессе. Все дополнительные аннотации, касающиеся размера буферов и направления копирования, не нужны, когда вызывающая сторона и вызываемая сторона могут напрямую делиться указателями.
Если вы когда-нибудь захотите перейти на Windows, учтите, что общие библиотеки могут иметь разные распределители и разную компоновку классов. Лучше всего экспортировать фабричную функцию, вернуть указатель на интерфейс (абстрактный класс, имеющий только чисто виртуальные функции-члены и не имеющий данных, данные и реализации находятся в подклассе), и позволить объекту освободиться (один из Виртуальный член функции уничтожает его).
Например, вы можете посмотреть на COM IUnknown
, Вам не нужна вся сложность запросов интерфейса и так далее, но использование чисто виртуальных функций и подсчета ссылок — это очень гибкий, очень масштабируемый и чрезвычайно переносимый шаблон.
Других решений пока нет …