![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| $tatic |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 28.1.2005 Репутация: 2 Всего: 22 |
Как реализовать поддержку плагинов к своей программе, т.е. обеспечить возможность загружать сборки и использовать классы из них?
|
|||
|
||||
| nikf |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 6.6.2005 Где: город-герой Жирно вск Репутация: нет Всего: 1 |
есть такои вариант,очч корявый и на фиксированное количество плагинов. но работает.. сначала в отдельной сборке объявляешь интерфейс того класса реализацию которых тебе должны дать плагины.. потом делаешь плагины-заглушки с именами к примеру plug01.dll plug02.dll ...plugN.dll. вних реализуешь(фиктивно) интерфейс(достаточно сделать одну заглушку, а потом скопировать в остальные). Подключаешь все заглушки к основному проекту. В начале работы программы составляешь список файлов plug*.dll и потом из имеющихся dll получаешь реализации своего интерфейса. так как при работе программы компилируется только тот код который должен быть выполнен, то ошибки при отсутствии того или иного плагина не возникает. конечно если не пытаться настырно получить объект из отсутствующей dll.
ну я так делаю. У меня интерфейс класса базы данных, а реальное подключение осущ-ют вот такие плагины в зависимости от формата базы данных... Мобыть кто лучше знает - мне тоже интересно... |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
System.Reflection.Assembly.Load()
Activator.CreateInstance() |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
То, что делает nikf, только в более упрощённом варианте: основная программа "знает" о допустимых плагинах, "выставляя" наружу како-то интерфейс типа IMyPlugin. Программа при своём запуске проверяет наличие плагинов в определённой директории(-ях), например в директории "bin". Далее, основная программа загружает плагины, найденные ею, используя метод "Assembly.LoadFrom (dllFileName)" и получает объекты типа Assembly (т.е. длл-ки плагинов). Далее, основная программа производит поиск типа, унаследованного от IMyPlugin, во всех получившихся assembly. Если программа нашла тип, реализующий IMyPlugin в длл-ке SomePlugin.dll, то программа создаёт экземпляр этого типа с пом. Activator.CreateInstance, и вызывает какой-то инициализирующий метод этого объекта, типа "IMyPlugin.Initialize (MainProgram program)". После того, как все найденные длл-ки были проинициализированы данным способом, основная программа по идее готова работать с использованием загруженных в неё plug-ин'ов.
З.Ы, чтобы каждый plug-in "знал" о внутренних процессах, происходящих внутри основной программы (или даже внутри одного из других plug-in'ах), можно в методе IMyPlugin.Initialize "подписывать" плагин на события основной программы. -------------------- ![]() |
|||
|
||||
| Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 3 Всего: 154 |
Насколько я знаю, именно таким образом данная проблема и решается. Причем на любых языках. -------------------- |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |