Я опишу довольно простую технику, которую я использовал в прошлом. Этот подход использует отражение C #, чтобы помочь в процессе загрузки плагина. Эту технику можно изменить, чтобы она применима к C ++, но вы теряете удобство использования отражения.
Интерфейс IPlugin
используется для идентификации классов, реализующих плагины. В интерфейс добавлены методы, позволяющие приложению взаимодействовать с плагином. Например, метод Init
, который приложение будет использовать для указания плагину инициализировать.
Для поиска плагинов приложение сканирует папку плагинов для сборок .Net. Каждая сборка загружена. Отражение используется для сканирования классов, которые реализуют IPlugin
. Создается экземпляр каждого класса плагина.
(В качестве альтернативы в файле XML может быть указан список загружаемых сборок и классов. Это может повысить производительность, но я никогда не обнаруживал проблем с производительностью).
Метод Init
вызывается для каждого объекта плагина. Передается ссылка на объект, который реализует интерфейс приложения: IApplication
(или что-то еще, названное специально для вашего приложения, например, ITextEditorApplication).
IApplication
содержит методы, позволяющие плагину взаимодействовать с приложением. Например, если вы пишете текстовый редактор, этот интерфейс будет иметь свойство OpenDocuments
, позволяющее плагинам перечислять коллекцию открытых в данный момент документов.
Эта система плагинов может быть расширена до языков сценариев, например, Lua, путем создания производного класса плагинов, например, LuaPlugin
, который передает функции IPlugin
и интерфейс приложения к сценарию Lua.
Этот метод позволяет итеративно реализовывать ваши IPlugin
, IApplication
и другие специфичные для приложения интерфейсы во время разработки. После того, как приложение будет завершено и подвергнуто рефакторингу, вы сможете документировать свои открытые интерфейсы, и у вас должна быть хорошая система, для которой пользователи могут писать свои собственные плагины.