Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как реализовать плагины, Загрузка сборок в рантайме 
:(
    Опции темы
$tatic
Дата 26.7.2005, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 28.1.2005

Репутация: 2
Всего: 22



Как реализовать поддержку плагинов к своей программе, т.е. обеспечить возможность загружать сборки и использовать классы из них?
PM MAIL   Вверх
nikf
Дата 26.7.2005, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 6.6.2005
Где: город-герой Жирно вск

Репутация: нет
Всего: 1



есть такои вариант,очч корявый и на фиксированное количество плагинов. но работает.. сначала в отдельной сборке объявляешь интерфейс того класса реализацию которых тебе должны дать плагины.. потом делаешь плагины-заглушки с именами к примеру plug01.dll plug02.dll ...plugN.dll. вних реализуешь(фиктивно) интерфейс(достаточно сделать одну заглушку, а потом скопировать в остальные). Подключаешь все заглушки к основному проекту. В начале работы программы составляешь список файлов plug*.dll и потом из имеющихся dll получаешь реализации своего интерфейса. так как при работе программы компилируется только тот код который должен быть выполнен, то ошибки при отсутствии того или иного плагина не возникает. конечно если не пытаться настырно получить объект из отсутствующей dll.
ну я так делаю. У меня интерфейс класса базы данных, а реальное подключение осущ-ют вот такие плагины в зависимости от формата базы данных...
Мобыть кто лучше знает - мне тоже интересно...
PM MAIL   Вверх
Guest
Дата 26.7.2005, 21:56 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











System.Reflection.Assembly.Load()
Activator.CreateInstance()
  Вверх
mr.DUDA
Дата 26.7.2005, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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 "подписывать" плагин на события основной программы.


--------------------
user posted image
PM MAIL WWW   Вверх
Medved
Дата 6.8.2005, 02:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 3
Всего: 154



Цитата(mr @ 27.7.2005, 02:16)
То, что делает 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 "подписывать" плагин на события основной программы.


Насколько я знаю, именно таким образом данная проблема и решается. Причем на любых языках.



--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0443 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.