Я разрабатываю приложение, которое я хочу расширять с помощью плагинов.
Здесь, в SO, я нашел много предложений по использованию MEF, который является простым решением для загрузки библиотек DLL плагинов из каталога.
Обычный подход заключается в настройке базового класса или интерфейса, которые плагины должны наследовать / реализовывать, и включать этот класс / интерфейс в библиотечную сборку, т.е. PluginBase.dll, на которую будут ссылаться как приложение, так и плагин.
У меня две проблемы с использованием этой техники:
Общие классы
В основном приложении будут классы, которые также должны быть доступны для плагинов.
Очевидное решение состоит в том, чтобы переместить их в сборку общей библиотеки, но я не думаю, что правильно иметь классы thoose в PluginBase.dll, поскольку они не связаны с архитектурой плагина.
Я мог бы также создать отдельную DLL для таких классов, но это означало бы, что вторая библиотека должна быть загружена при запуске и включена в плагин для разработки (на самом деле это не проблема, но я бы предпочел новичкам просто добавить одну ссылка).
Доступность членов
Это реальная проблема: я также пишу внутренние плагины, которые имеют больше контроля над приложением.
Так как любой член внутреннего типа требует, чтобы его класс был перемещен в PluginBase.dll, мне пришлось унаследовать базовый класс плагина в 2 других типах (обычный и внутренний плагин) и ставить только базовые и нормальные классы на PluginBase.dll. Но на самом деле это еще хуже, потому что плагин может иметь графический интерфейс или нет, так что в конце дня все удваивается ... это становится слишком грязно.
Решение (правда?)
Я обнаружил, что могу напрямую добавить ссылку на основное приложение в проекте плагина, и благодаря этому я могу легко получить доступ к любому классу. Но также скрытие класса / членов - это просто вопрос или использование спецификатора видимости internal .
Нет интерфейсов для реализации, нет других сборок для загрузки при запуске, это просто кажется быстрее, проще и эффективнее.
Есть ли побочные эффекты, о которых я должен знать, используя этот подход?