![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| asper |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 10.8.2005 Репутация: нет Всего: нет |
Есть задача - создать масштабируемое приложение на vb.net
Технология незнакомая. Море статей и форумов сводит задачу к созданию некого главного приложения и плагинов к нему. При этом возникает ряд вопросов: 1) Может ли плагин содержать интерфейсную часть (формы и прочее) или это надо реализовывать отдельно (классом Interface? как?) ? 2) Есть такое понятие как domain Application. Хотелось бы уточнить его смысл. Когда его стоит применять? как? не будет ли это в ущерб скорости работы приложения? 3) Проблема в том, что в зависимости от прав пользователей должно загружаться меню соответствующего вида, пункты которого - вызовы плагинов. Может быть, кто-нибудь подскажет, где можно взглянуть близкий по смыслу пример - нахожу в основном консольные приложения, а интересует - windows.forms. Может быть, кто-то может подсказать толковые книжки? Заранее спасибо огромное! |
|||
|
||||
| mr.DUDA |
|
||||||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Модератор: Пожалуйста, один топик - один вопрос.
Любая assembly может содержать любое количество форм и прочих компонентов. Если явно подключить (через reference) эту assembly к проекту, в проекте станут доступны все public-формы и компоненты из неё. Если нужно подключить одну assembly к другой в рантайме (как плагин), то всё что требуется для того, чтобы показать форму - это создать экземпляр формы и вызвать Show/ShowDialog. Сделать это можно как внутри плагина, так и вне его. Для того, чтобы вызывающая assembly могла показать форму из assembly-плагина, можно создать интерфейс, о котором будут знать обе assembly, и который будет содержать метод типа GetMySuperForm или ShowAnotherForm. Тут всё зависит от фантазии разработчика.
Application Domain - это среда, в которой исполняется приложение. Обычно не требуется создание более чем одного домена; дефолтный домен создаётся автоматически и в нём исполняется ф-ция Main. Тормоза могут появляться при передаче вызова между двумя доменами, т.к. домены полностью отделены друг от друга и для вызова метода из другого домена используется маршаллинг.
Где проблема ?
Книг полно в соответствующем разделе форума. -------------------- ![]() |
||||||||
|
|||||||||
| asper |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 10.8.2005 Репутация: нет Всего: нет |
Спасибо за ответы.
Оставляю один вопрос
Проблема в том, что я не знаю, как это сделать. Т.е. как организовать плагин и вызвать его как dll из основной программы. Примеры консольных приложений есть, причем не слишком понятные - много необъясняемых и некомментируемых наворотов, а вот насчет windows-приложений... поиски не принесли успеха, и переделать не удается. Может быть, поможете примерчиком? |
|||
|
||||
| asper |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 10.8.2005 Репутация: нет Всего: нет |
Кстати, практически ни одна книга не закачивается - прокси ругается
|
|||
|
||||
| asper |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 10.8.2005 Репутация: нет Всего: нет |
Вызвать плагин получилось. Но не улавливаю, как сделать, чтобы после компиляции dll записывалась в определенный каталог dll-ек, откуда основная программа и будет их брать.
Создание файла plag_app.config в каталоге плагина не помогло...
Что не так? |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Проще всего dll-ки складывать в отдельную папку "bin" внутри директории основной программы. Тогда загрузить плагин можно не указывая путь к длл-ке: Assembly.Load ("plugin.dll"). Если этот вариант не подходит, можно размещать длл-ки где угодно, и грузить их с пом. Assembly.LoadFrom. Тэг assemblyBinding и qualifyAssembly используется, когда нужно иметь возм-сть грузить длл-ки из GAC с пом. Assembly.Load (partialName).
-------------------- ![]() |
|||
|
||||
| asper |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 10.8.2005 Репутация: нет Всего: нет |
Спасибо за ответ.
Но имелось в виду, что можно ли сделать так, чтобы при компиляции библиотеки она автоматически закидывалась в конкретный каталог, дабы разработчику плагина не надо было вручную копировать ее туда, откуда ее потом возьмет основная программа. А если вопрос касается тоже загрузки плагина, то можно его поместить в эту же тему или надо создавать новую? Дело в том, что не ясно, как проверить, что форма, представляющая собой плагин, запущена в одном экземпляре. Если нужно - вот код запуска плагина
|
|||
|
||||
| asper |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 10.8.2005 Репутация: нет Всего: нет |
И еще, а как в случае с плагинами разрешится такая ситуация: пользователь работает с программой, использующей плагин. В этот момент разработчик заменяет плагин на более новую версию. Как поведет себя программа пользователя и как разрешить такую ситуацию?
|
|||
|
||||
| mr.DUDA |
|
||||||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Ух, сколько вопросов...
Свойства проекта, "Output directory". З.Ы. у тебя студия скопирует длл-ку куда надо, а что будет у пользователя? Тоже VS.NET ему поставишь
Ладно уж, и так нафлудили. Давай тут разбираться.
Больше чем в одном экземпляре ты одну длл-ку не загрузишь, это факт. Чтобы определить, сколько форм одного типа у тебя создано, используй статическую переменную-счётчик, либо сделай форму синглтоном.
Насчёт версионности есть много умных статей, но как я сейчас это себе представляю: если длл-ка не подписана ключом, то её версия подойдёт для основной программы в случае, если эта версия не более старая, чем та, с которой программа работала ранее (т.е. та, которая указана в references основной программы). Если же подписана, то там свои правила. -------------------- ![]() |
||||||||
|
|||||||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [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. |