Такое реально?

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Такое реально?

Сообщение Fedorfx » 21.09.2005 (Ср) 15:20

Допустим есть проект.
В нем публичный класс.
Есть дочерняя форма которая взаимодействует с этим глобальным классом.
Нужно загрузить в проект другой обьект который бы общался с этим глобальным обьектом.
ну что то типа
dim mform as xxx
dim cform as yyy
xxx.work(yyy)
так вот надо не dim cform yyy a загрузить с диска.
Есть идеи?
P.S. Надеюсь это все будет работать в одном адресном пространстве.
Просто есть обьект - сервер который пашет 24*7. и перекомпилировать его при внесении изменения в клиента неохота.
Вот я и думаю - разделить их и компилить только клиента.

Snussi
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 151
Зарегистрирован: 21.07.2004 (Ср) 18:08
Откуда: Москва, Россия

Сообщение Snussi » 21.09.2005 (Ср) 16:54

Может тебе это и поможет :))

Создаешь сервер + в каком-нибудь каталоге сервера накидываешь DLL-ки, каждая из которых представляет собой сборку для одного из меняемых тобой объектов.
Далее (так это сделано у меня):
Код: Выделить всё
Module PluginModule
    Private Structure PluginsMethods
        Dim tmp As System.Reflection.MethodInfo
    End Structure

    Private Structure PluginsStruct
        Dim AssemblyName As String
        Dim BaseType As Type
        Dim BaseObject As Object

        Dim PluginStruct As PluginShared.MainDefenitions.PluginInfoStruct

        Dim Methods As PluginsMethods
    End Structure

    Private PlugCollection As New Collection
    Public Sub InitPlugins()
        ' Итак, самая важная часть - загрузка модулей.
        ' Зарядим цикл по всей директории Plugins
        If Not System.IO.Directory.Exists(PathToApp + "Plugins") Then
            SaveToLog("Не найдена директория плагинов. Создание...", LogSubSystem.LogLevels.Notice)
            System.IO.Directory.CreateDirectory(PathToApp + "Plugins")
        End If
        Dim PluginsMassive() As String
        PluginsMassive = System.IO.Directory.GetFiles(PathToApp + "Plugins", "*.dll")
        Dim i As Long
        ' По всем плагинам!
        Dim mAssembly As System.Reflection.Assembly

        Dim mFlags As System.Reflection.BindingFlags = System.Reflection.BindingFlags.DeclaredOnly Or System.Reflection.BindingFlags.Public Or System.Reflection.BindingFlags.NonPublic Or System.Reflection.BindingFlags.Instance

        Dim tmp As PluginsStruct
        Dim tmpMethod As System.Reflection.MethodInfo
        Dim ModuleInited As Boolean

        For i = 0 To PluginsMassive.GetUpperBound(0)
            Console.writeline("Загрузка модуля " + System.IO.Path.GetFileNameWithoutExtension(PluginsMassive(i)))
            mAssembly = System.Reflection.Assembly.LoadFrom(PluginsMassive(i))
            tmp.AssemblyName = mAssembly.GetName.Name
            tmp.BaseType = mAssembly.GetType(tmp.AssemblyName + ".PluginMain")
            ModuleInited = True
            ' Попробуем синициализировать модуль. Если не выйдет - это не наш модуль!
            Try
                tmpMethod = tmp.BaseType.GetMethod("InitModule")
            Catch ex As Exception
                ModuleInited = False
            End Try
            If ModuleInited Then
                ' Если модуль синициализирован, то
                ' 1. Получим информацию по модулю
                tmp.BaseObject = tmp.BaseType.InvokeMember(Nothing, mFlags Or System.Reflection.BindingFlags.CreateInstance, Nothing, Nothing, Nothing)
                tmp.PluginStruct = tmpMethod.Invoke(tmp.BaseObject, Nothing)
                Console.writeline("Инициализация модуля " + tmp.PluginStruct.PluginLongName)

                ' 2. Проинициализируем модуль
                tmpMethod = tmp.BaseType.GetMethod("KakoyNibudObschiyMetod")
                tmpMethod.Invoke(tmp.BaseObject, Nothing)

                ' 3. Добавим обработку событий
                AddHandler tmp.BaseObject.TestEvent, AddressOf EventRaised


                PlugCollection.Add(tmp)
            End If
        Next
    End Sub
    Private Sub EventRaised()

    End Sub
End Module



Этот код создает коллекцию ДЛЛ-ок с событием TestEvent, каждую инициализирует методом KakoyNibudObschiyMetod, проверяет его при помощи метода InitModule.
Вроде все. Если чего-то непонятно - объясню :)

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 21.09.2005 (Ср) 18:58

Спасибо. Бум разбираться.
Вот интересно, а если я буду грузить обьект с известным для сервера интерфейсом, то наверное все попроще будет.

Snussi
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 151
Зарегистрирован: 21.07.2004 (Ср) 18:08
Откуда: Москва, Россия

Сообщение Snussi » 22.09.2005 (Чт) 8:59

Ты знаешь, я сам новичок в этих делах :)

По-моему (гуру меня поправят) - это не важно. В моем примере я знаю все интервейсы (точнее, свойства и методы объекта) - и все равно это мало помогает :(

Буду признателен за более простые методы, если они есть.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 52

    TopList