Программное вычисление имени Dll

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

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

edyapd
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 03.10.2011 (Пн) 19:54

Программное вычисление имени Dll

Сообщение edyapd » 12.07.2012 (Чт) 11:28

Программа требует явного указания имени вызываемой Dll.
Типа:
Код: Выделить всё
Imports myDll

или
Код: Выделить всё
<DllImport("myDll.dll")>

А есть возможность в процессе выполнении программы выбрать имя Dll которую и подгрузить, для обращения к ней?
К примеру у меня есть myDll1 - myDll1000.
В программе по каким то условиям надо обратиться к myDll777. Но не прописывать же их все.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.07.2012 (Чт) 16:10

Imports работает с пространством имён, модулем или классом. Не с dll.
Для DllImport имя dll надо знать.

Если библиотека .NET'овская, то можно использовать рефлексию. Если нет, то WinApi.

edyapd
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 03.10.2011 (Пн) 19:54

Re: Программное вычисление имени Dll

Сообщение edyapd » 12.07.2012 (Чт) 19:42

Qwertiy писал(а):Если библиотека .NET'овская, то можно использовать рефлексию. Если нет, то WinApi.

А небольшой пример можно?
Пока думаю на VB или Delphi, делать библиотеку.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.07.2012 (Чт) 20:44

Зачем это вообще надо? Единственное нормальное использование, которое сразу приходит в голову - плагины.
Кстати, оба варианта будут работать медленнее, чем если бы библиотека была подключена при компиляции. И пользоваться ими сложнее.

Пример мне сейчас делать некогда. Надо для начала рабобраться с Проводником, Фемидой и (по-возможности) потыкать Firefox. А ещё, есть идея сделать обёртку над .NET dll, чтобы можно было делать .NET плагины для Download Master'а.

Из того, что есть (надо сюда ещё кучу проверок напихать):
Код: Выделить всё
Imports System.Reflection

Module WorkingWithPlugins

Public Sub LoadPlugins(Menu As ToolStripMenuItem)
  For Each Dll As String In Directory.GetFiles(Path.Combine(My.Application.Info.DirectoryPath, "Plugins"), "*.dll")
    For Each Type As Type In Assembly.LoadFile(Dll).GetTypes()
      If Type.GetInterface("IMasterPlugin") IsNot Nothing Then
        Dim Obj As IMasterPlugin = Type.GetConstructor({}).Invoke({})
        Menu.DropDownItems.Add(Obj.Text, Nothing, Sub() ShowMaster("", Obj.CreateStepsSequence()))
      End If
      If Type.GetInterface("IIndependentPlugin") IsNot Nothing Then
        Dim Obj As IIndependentPlugin = Type.GetConstructor({}).Invoke({})
        Menu.DropDownItems.Add(Obj.Text, Nothing, AddressOf Obj.Execute)
      End If
    Next Type
  Next Dll
End Sub

End Module

Для получения функций из нативных dll надо использовать функции LoadLibrary и GetProcAddress. Почти уверен, что в сочетании с .NET выплывет куча подводных камней...


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

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

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

    TopList