Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 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
  1.  
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Windows.Forms;
  7. using System.Runtime.InteropServices;
  8. using System.EnterpriseServices;
  9. using System.Reflection;
  10. using System.IO;
  11.  
  12. namespace ComServer
  13. {
  14.  
  15.     [GuidAttribute("7B38697A-E6A5-4b40-8BE6-95971CEAC4A6")]
  16.     [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
  17.     public interface ITest
  18.     {
  19.         string Method(string message);
  20.         string Vertragnum(string Vertrag);
  21.         
  22.     }
  23.  
  24.     public interface cForm
  25. {
  26.         string OpenFromDll();
  27. }
  28.  
  29.     [EventTrackingEnabledAttribute(true)]
  30.  
  31.     [Guid("4B52E4C8-FE58-413e-9E3D-463F410A2F7A")]
  32.     [ClassInterface(ClassInterfaceType.None)]
  33.   
  34.     [assembly: ComponentAccessControl(false)]
  35.       public class Form1 : System.Windows.Forms.Form
  36.     {
  37.         # region cForm Members
  38.         public void OpenFromDll()
  39.         {
  40.             
  41.             ComServer.wmForm CmForm = new ComServer.wmForm();
  42.             CmForm.Show();
  43.  
  44.         }
  45.         #endregion
  46.     }
  47.  
  48.  
  49.  
  50.     
  51. }



до метода .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

вобшем алгоритм след. (если я ошибся поправь меня пожалуста очень надо.):
собрать длл.
вызвать метод шоу(пока не понятно как) :)
наверно типа так
  1.  
  2. ComServer.wmForm CmForm = new ComServer.wmForm();
  3.             CmForm.Show();


а затем через форму доставать содержимое тхт

верно?

Ответить

Номер ответа: 7
Автор ответа:
 El



Вопросов: 6
Ответов: 19
 Профиль | | #7 Добавлено: 27.09.10 17:12
Artyom пишет:
А при чем здесь COM?


он регестрирует длл в системе

Ответить

Номер ответа: 8
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #8 Добавлено: 27.09.10 17:43
На чем напи
El пишет:
я наверно неверно поставил изначально вопрос. ситуация след. мне надо позывать из отдельного приложения длл с вложенной
формой. форма будет заполняться и данные с формы должны передаваться в приложение вызвавшее длл.
из написанного выше мне надо было (наскоко я понял) достучаться до метода шоу, что я и сделал(но видимо чтото не совсем корректно)
вс студия компилирует длл но при вызове идет ошибка.
Я попробую написать то что ты предложил.


На чем написано "отдельное приложение"? Если оно написано на дотнете, и твоя библитоека написана на дотнете, то 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
'Прям любопытно стало, что за сложности :)
'
  1. using System.Windows.Forms;
  2. 'namespace ClassLibrary1
  3. '{
  4. '    public class Class1
  5. '    {
  6. '        public void OpenFromDll()
  7. '        {
  8. '            Form frm = new Form();
  9. '            frm.ShowDialog();
  10. '        }
  11. '    }
  12. '}
  13. '

'
'задал [assembly: ComVisible(true)]
'выставил галку Регистрация для COM-взаимодействия
'убедился что tlb создается
'
'и в VbScript
'
  1.  
  2. 'Dim a
  3. 'Set a = CreateObject("ClassLibrary1.Class1")
  4. 'a.OpenFromDll
  5. '

'
'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
  1.  
  2.             CmForm.ShowDialog();
  3.             return Convert.ToString(CmForm.txtVertrag.Text);


передает в мое приложение данные с одного текстбокса
а как передать мне все данные с каждого текстбокса формы

Ответить

Номер ответа: 15
Автор ответа:
 El



Вопросов: 6
Ответов: 19
 Профиль | | #15 Добавлено: 28.09.10 14:00
или надо писать отдельную методу для етого?

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам