Плагины, использующие (сборку) ссылку на хост-приложение - PullRequest
0 голосов
/ 13 июля 2011

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

Здесь, в SO, я нашел много предложений по использованию MEF, который является простым решением для загрузки библиотек DLL плагинов из каталога. Обычный подход заключается в настройке базового класса или интерфейса, которые плагины должны наследовать / реализовывать, и включать этот класс / интерфейс в библиотечную сборку, т.е. PluginBase.dll, на которую будут ссылаться как приложение, так и плагин.

У меня две проблемы с использованием этой техники:

  1. Общие классы

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

    Очевидное решение состоит в том, чтобы переместить их в сборку общей библиотеки, но я не думаю, что правильно иметь классы thoose в PluginBase.dll, поскольку они не связаны с архитектурой плагина.

    Я мог бы также создать отдельную DLL для таких классов, но это означало бы, что вторая библиотека должна быть загружена при запуске и включена в плагин для разработки (на самом деле это не проблема, но я бы предпочел новичкам просто добавить одну ссылка).

  2. Доступность членов

    Это реальная проблема: я также пишу внутренние плагины, которые имеют больше контроля над приложением.

    Так как любой член внутреннего типа требует, чтобы его класс был перемещен в PluginBase.dll, мне пришлось унаследовать базовый класс плагина в 2 других типах (обычный и внутренний плагин) и ставить только базовые и нормальные классы на PluginBase.dll. Но на самом деле это еще хуже, потому что плагин может иметь графический интерфейс или нет, так что в конце дня все удваивается ... это становится слишком грязно.

Решение (правда?)

Я обнаружил, что могу напрямую добавить ссылку на основное приложение в проекте плагина, и благодаря этому я могу легко получить доступ к любому классу. Но также скрытие класса / членов - это просто вопрос или использование спецификатора видимости internal . Нет интерфейсов для реализации, нет других сборок для загрузки при запуске, это просто кажется быстрее, проще и эффективнее.

Есть ли побочные эффекты, о которых я должен знать, используя этот подход?

Ответы [ 2 ]

0 голосов
/ 26 июля 2011

Если вы используете WPF, вам нужно увидеть Prism Это хорошо, может быть, это поможет вам в создании приложений на основе плагинов.

0 голосов
/ 14 июля 2011

То, как я это делаю, в том же смысле, что и это: http://rickrat.wordpress.com/2011/01/24/using-mef-to-link-view-model-locator-and-load-assembly-uis-dynamically/ enter image description here

Приложение и плагин не должны знать друг о друге, они должны только ссылаться на общую сборку контракта.

Предупреждение: убедитесь, что dll ваших общих контрактов подписана с открытым ключом, потому что, если MEF найдет его в папке надстройки (что может быть), он попытается загрузить его дважды. Имея открытый ключ, он проверяет его на то, что уже загружено, и не загружает его снова.

...