| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Как реализовать плагины |
| Автор: $tatic 26.7.2005, 14:35 |
| Как реализовать поддержку плагинов к своей программе, т.е. обеспечить возможность загружать сборки и использовать классы из них? |
| Автор: nikf 26.7.2005, 18:32 |
| есть такои вариант,очч корявый и на фиксированное количество плагинов. но работает.. сначала в отдельной сборке объявляешь интерфейс того класса реализацию которых тебе должны дать плагины.. потом делаешь плагины-заглушки с именами к примеру plug01.dll plug02.dll ...plugN.dll. вних реализуешь(фиктивно) интерфейс(достаточно сделать одну заглушку, а потом скопировать в остальные). Подключаешь все заглушки к основному проекту. В начале работы программы составляешь список файлов plug*.dll и потом из имеющихся dll получаешь реализации своего интерфейса. так как при работе программы компилируется только тот код который должен быть выполнен, то ошибки при отсутствии того или иного плагина не возникает. конечно если не пытаться настырно получить объект из отсутствующей dll. ну я так делаю. У меня интерфейс класса базы данных, а реальное подключение осущ-ют вот такие плагины в зависимости от формата базы данных... Мобыть кто лучше знает - мне тоже интересно... |
| Автор: Guest 26.7.2005, 21:56 |
| System.Reflection.Assembly.Load() Activator.CreateInstance() |
| Автор: mr.DUDA 26.7.2005, 23: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 "подписывать" плагин на события основной программы. |
| Автор: Medved 6.8.2005, 02:46 | ||
Насколько я знаю, именно таким образом данная проблема и решается. Причем на любых языках. |