Динамическое подключение DLL, которая в свою очередь использует другие DLL - Visual Basic .NET

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Направьте на путь истинный, как поступить след. образом: Пишу небольшое приложение, которое юзает стороннее DLL из системной папки, при добавлении в references стандартным способом, VS подтягивает в папку с проектом еще 4 DLL вместе с выбранным. Они все связаны между собой. Т.к. на компах юзеров эти DLL всегда расположены по одному пути, решил попытаться подключать библиотеки через Reflection.Assembly.LoadFile. Но дальше знаний не хватает: при попытке получить GetExportedTypes выдает исключение "Could not load file or assembly %название DLL%". Как подключить все эти 4 DLL динамически, чтобы основная могла к ним обращаться?

Решение задачи: «Динамическое подключение DLL, которая в свою очередь использует другие DLL»

textual
Листинг программы
Imports System.Reflection
Imports MyDll
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim Domain As AppDomain = AppDomain.CurrentDomain
        AddHandler Domain.AssemblyResolve, AddressOf MyResolveEventHandler
        F()
    End Sub
    Private Sub F()
        Dim MyFunc As MyDll.GetData
        Dim result As String = MyFunc(Param)
    End Sub
    Function MyResolveEventHandler(ByVal sender As Object, ByVal args As ResolveEventArgs) As [Assembly]
        'This handler is called only when the common language runtime tries to bind to the assembly and fails.        
 
        'Retrieve the list of referenced assemblies in an array of AssemblyName.
        Dim objExecutingAssemblies As [Assembly]
        objExecutingAssemblies = [Assembly].GetExecutingAssembly()
        Dim arrReferencedAssmbNames() As AssemblyName
        arrReferencedAssmbNames = objExecutingAssemblies.GetReferencedAssemblies()
 
        'Loop through the array of referenced assembly names.
        Dim strAssmbName As AssemblyName
        For Each strAssmbName In arrReferencedAssmbNames
 
            'Look for the assembly names that have raised the "AssemblyResolve" event.
            If (strAssmbName.FullName.Substring(0, strAssmbName.FullName.IndexOf(",")) = args.Name.Substring(0, args.Name.IndexOf(","))) Then
 
                'Build the path of the assembly from where it has to be loaded.
                Dim strTempAssmbPath As String
                strTempAssmbPath = "C:\assemblies\" & args.Name.Substring(0, args.Name.IndexOf(",")) & ".dll"
 
                Dim MyAssembly As [Assembly]
 
                'Load the assembly from the specified path. 
                MyAssembly = [Assembly].LoadFrom(strTempAssmbPath)
 
                'Return the loaded assembly.
                Return MyAssembly
            End If
        Next
        Return Nothing
    End Function
End Class

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.462 из 5
Похожие ответы