![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 3 Всего: 154 |
Подскажите общую схему реализации плагинов в своей программе. Какие могутт быть подводные камни?. Планируется это осуществлять для крупного и довольно сложного web-сервиса.
-------------------- |
|||
|
||||
| Mad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 1 Всего: 19 |
Мы используем такую схему:
AppDomain.Current.LoadAssembly() для загрузки плагина потом через Runtime или создаеш обьект класса, или вызываеш static функции Но есть один минус : выгрузить dll уже нельзя |
|||
|
||||
| Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 3 Всего: 154 |
А можно поподробнее?
Добавлено @ 15:09 Я планировал реализовывать через интерфейсы. -------------------- |
|||
|
||||
| Mad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 1 Всего: 19 |
Вот класс для загрузки плагинов
LoadModule() возвращает обьект класса по имени |
|||
|
||||
| Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 3 Всего: 154 |
Посмотрел вскольз я на пример, и ИМХО через интерфесы будет более универсально, и к тому же более приближено к пардиаграме ООП. Хотя возможно что я и ошибаюсь. Но в любом случае спасибо!
-------------------- |
|||
|
||||
| Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 3 Всего: 154 |
НИкто никогда не реализовывал механизм плагинов?
-------------------- |
|||
|
||||
| Mad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 1 Всего: 19 |
Pegas
Кстати , сам об этом не думал |
|||
|
||||
| arilou |
|
|||
![]() Великий МунаБудвин ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2646 Регистрация: 15.7.2004 Где: город-герой Минск Репутация: 21 Всего: 61 |
Мои пять копеек
1) С помощью интерфейсов определяется стандартная схема взаимодействия плагина с хост-приложением и наоборот. Например, интерфейс дает возможность плагину сообщить, в каком меню, после какого и перед каким элементом он должен появиться 2) Основное приложение при запуске или считывает информацию о том, какие плагины надо загрузить, например, из конфига, или берет все DLL'ки из определенной папки. 3) С помощью Reflection'a из сборок, содержащих плагины, достается информация о том, какой именно класс реализует искомый интерфейс IPlugin 4) С помощью того же Reflection'a создается экземпляр основного класса-плагина. Он приводится к интерфейсу IPlugin, и через него происходит собственно взаимодействие Хороший пример реализации плагинов используется в среде разработки Sharp Develop. На сайте можно скачать source code и доки, её описывающие. Добавлено @ 15:48
В таких случах плагин грузят в другой домен. Домены выгружать можно, и, кстати, это защищает основное приложение от крэшев в плагинах. |
|||
|
||||
| Mad |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 1 Всего: 19 |
Появляються сложности общения с основным приложением (обмен данными)
Для этого просто ставиться свой обработчик Exception (Application.ThreadException) |
||||
|
|||||
| arilou |
|
||||
![]() Великий МунаБудвин ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2646 Регистрация: 15.7.2004 Где: город-герой Минск Репутация: 21 Всего: 61 |
В случае, если плагины может разрабатывать треья сторона, их надо изолировать. Я считаю, что потратив сразу некоторое время на создание стандартного мех-ма взаимодействия плагина с основной программой (обертку вокруг CrossDomainDelegate), можно отсечь возможные проблемы в будущем.
Есть exception'ы, которые не ловятся Application.ThreadException. Видел не один раз, особенно в релиз-версии. |
||||
|
|||||
| Mad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 1 Всего: 19 |
Например ? |
|||
|
||||
| arilou |
|
||||
![]() Великий МунаБудвин ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2646 Регистрация: 15.7.2004 Где: город-герой Минск Репутация: 21 Всего: 61 |
Приложение работает некоторое время (час, 5 минут, пол-дня). Потом вылазит сообщение "Unhandled exception, thread id bla bla, process id bla bla". И всё. Во всех возможных местах стоят обработчики. Детально описать не получится - приложение сложное.
Добавлено @ 17:00
Вопрос не по теме - а почему foreach не используешь? |
||||
|
|||||
| Mad |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 1 Всего: 19 |
Это глюк 1.0 (вылетает сама VM) и уже не важно в каком AppDomain это произошло, закрывается все приложение (а иногда и все .NET приложения на тачке Добавлено @ 17:05
Я отот класс писал когда тока начал C# учить (больше технология интересовалла чем особенности языка). Да и теперь восновном for использую, привычней |
||||
|
|||||
| Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 3 Всего: 154 |
Я наоборот стараюсь реализовывать интерфейсы IComparable и IComparer в своих пользовательских классах, чтобы можно было применять к массивам этих объектова цикл forech. Чертовски удобно. -------------------- |
|||
|
||||
| arilou |
|
|||
![]() Великий МунаБудвин ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2646 Регистрация: 15.7.2004 Где: город-герой Минск Репутация: 21 Всего: 61 |
А что, ты не наследушь классы коллекций от стандартных (например, ArrayList) ? |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [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. |