Страница: 1 | 2 |
Вопрос: Form+dll+динамическая загрузка
Добавлено: 27.09.10 11:20
Автор вопроса: El
Здравствуйте.
Имеется следующие вопросы:
1) Каким образом осуществляется размещение формы в dll ? Написанной на C# естественно.
2) Как динамически загрузить эту dll и показать форму ?
кое что уже есть но хотелось бы знать ответы на ети вопрос
на 1 вопрос есть предположение или контрол добавить в проект или форму , а вот как бть со вторым вопросом
прошу помоши
здесь мои пытания :)
http://narod.ru/disk/25352638000/ComServer.rar.html
Ответы
Всего ответов: 25
Номер ответа: 1
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #1
Добавлено: 27.09.10 15:22
1) Создашеь проект типа Class Library, добавляешь форму, все как обычно. Собираешь в dll. Чтоб форму можно было использовать в других классах, нужно указать ей модификатор Public.
2) Динамическая загрузка сборки dll из файла (можно в принципе откуда угодно, и из ресурсов, и из инета) выполняется через Assembly.LoadFrom
Чтоб создать экземпляр класса, нужно или знать его полное название, или иметь ссылку на тип.
Экзепляр создаетяс или через Type.InvokeMember (с указанием что нужно вызвать конструктор), или через Activator.CreateInstance (тут указывается Type или string).
Получаешь ссылку на объект, но работать с ним пока нет возможности, сначала нужно привести к какому-то типу, например, Form. И тогда можешь вызывать его методы (Show, если надо отобразить форму).
Это в том случае если тебе нужно выполнять именно динамическую сборку. Если конкретно это не нужно, то все проще, собираешь dll, подключаешь ее к проекту и можешь создавать экземпляры классов как и любых других (через Dim XXX As New MyForm()).
Номер ответа: 2
Автор ответа:
El
Вопросов: 6
Ответов: 19
Профиль | | #2
Добавлено: 27.09.10 16:09
до метода .show я добрался но при вызове формы из dll при помоши скрипта получаю ошибку (без описания)
ошибка явно не в скрипте, посмотри пож-та код где я напортачил
Номер ответа: 3
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #3
Добавлено: 27.09.10 16:21
А при чем здесь COM?
Номер ответа: 4
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #4
Добавлено: 27.09.10 16:22
В этом куске кода ошибку не найти, тут вообще-то и кода то нет про который речь идет.
Номер ответа: 5
Автор ответа:
El
Вопросов: 6
Ответов: 19
Профиль | | #5
Добавлено: 27.09.10 16:46
я наверно неверно поставил изначально вопрос. ситуация след. мне надо позывать из отдельного приложения длл с вложенной
формой. форма будет заполняться и данные с формы должны передаваться в приложение вызвавшее длл.
из написанного выше мне надо было (наскоко я понял) достучаться до метода шоу, что я и сделал(но видимо чтото не совсем корректно)
вс студия компилирует длл но при вызове идет ошибка.
Я попробую написать то что ты предложил.
Номер ответа: 6
Автор ответа:
El
Вопросов: 6
Ответов: 19
Профиль | | #6
Добавлено: 27.09.10 16:56
вобшем алгоритм след. (если я ошибся поправь меня пожалуста очень надо.):
собрать длл.
вызвать метод шоу(пока не понятно как)
наверно типа так
а затем через форму доставать содержимое тхт
верно?
Номер ответа: 7
Автор ответа:
El
Вопросов: 6
Ответов: 19
Профиль | | #7
Добавлено: 27.09.10 17:12
А при чем здесь COM?
он регестрирует длл в системе
Номер ответа: 8
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #8
Добавлено: 27.09.10 17:43
На чем напи
я наверно неверно поставил изначально вопрос. ситуация след. мне надо позывать из отдельного приложения длл с вложенной
формой. форма будет заполняться и данные с формы должны передаваться в приложение вызвавшее длл.
из написанного выше мне надо было (наскоко я понял) достучаться до метода шоу, что я и сделал(но видимо чтото не совсем корректно)
вс студия компилирует длл но при вызове идет ошибка.
Я попробую написать то что ты предложил.
На чем написано "отдельное приложение"? Если оно написано на дотнете, и твоя библитоека написана на дотнете, то COM здесь вообще ни к месту.
Во-первых, .NET делает .NET-овские сборки, а не COM-овские.
Во-вторых, .NET таки может делать комовские сборки, но для этого нужно указывать что сборка собирается для COM и нужно помечать классы атрибтуами ComVisible (вроде бы).
В-третьих, .NET-овские сборки регистрируются не в реестре, а в GAC.
В-четвертых, это не обязательно, .NET-овские сборки можно использовать не регистрируя.
Как я понимаю, ты хочешь зачем-то вынести форму в отдельную сборку. Делаешь это, помечаешь ее Public, удаляешь все атрибуты которые ты наворотил потому что они там не нужны, собираешь сборку, подключаешь ее к своему приложению (через Add Reference) и используешь. Использвоание формы во внешней DLL не отличается от использования "своей" формы (только пространство имен нужно указать).
Динамическая загрузка сбокри нужна только если ты собираешься делать систему плагинов.
Все совсем по-другому, если хост-приложение не .NET. Тогда нужно делать COM-сборку и жутко гемороиться.
Номер ответа: 9
Автор ответа:
El
Вопросов: 6
Ответов: 19
Профиль | | #9
Добавлено: 27.09.10 18:20
да в том то и дело что вызывать длл я буду не из .нет а из отдельной программы(windream это для архивирования документов это приложение иммет возможность работать со вб скриптами, вот с помошю них мне и надо вызывать длл с формочкой,
пишутся скрипты в обычном текст редакторе поетому нет возможности делать адд референс токо путем создания регистрируемого в системе обьекта) .
Номер ответа: 10
Автор ответа:
El
Вопросов: 6
Ответов: 19
Профиль | | #10
Добавлено: 27.09.10 18:26
по поводу [assembly: ComVisible(true)]
я сделал ,результат тотже
ошибка говорит не может быть вызван
OpenFromDll()
Номер ответа: 11
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #11
Добавлено: 28.09.10 04:30
Нужно проверить, доходит ли выполнение до твоей сборки вообще.
Попробуй вместо формы показать MessageBox, или что-то на диск записать.
Номер ответа: 12
Автор ответа:
Eugy
Вопросов: 0
Ответов: 73
Профиль | | #12
Добавлено: 28.09.10 04:30
'Прям любопытно стало, что за сложности
'
'
'задал [assembly: ComVisible(true)]
'выставил галку Регистрация для COM-взаимодействия
'убедился что tlb создается
'
'и в VbScript
'
'
'El, что не понятного?
Номер ответа: 13
Автор ответа:
El
Вопросов: 6
Ответов: 19
Профиль | | #13
Добавлено: 28.09.10 11:41
спасибо мужикииии!!
frm.ShowDialog();
точно сработало ,а я пробовал с frm.Show();
Номер ответа: 14
Автор ответа:
El
Вопросов: 6
Ответов: 19
Профиль | | #14
Добавлено: 28.09.10 13:58
передает в мое приложение данные с одного текстбокса
а как передать мне все данные с каждого текстбокса формы
Номер ответа: 15
Автор ответа:
El
Вопросов: 6
Ответов: 19
Профиль | | #15
Добавлено: 28.09.10 14:00
или надо писать отдельную методу для етого?