Dlls aus Ressourcen laden zur Laufzeit

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Sev7eNup.

    Dlls aus Ressourcen laden zur Laufzeit

    Ich verwende für ein Programm das Krypton Tool Kit sowie die Qios DevSuite.

    Damit ich die dlls dem Programm nicht einzeln beilegen muss, lasse ich diese aus den Ressourcen über die Klasse ApplicationEvents.vb laden.

    Sofern ich nur eine DLL laden lasse funktioniert das auch ganz gut. Wenn ich jedoch beide dlls laden lassen will, findet er die letzere nicht, also die dll auf die als zweites in ApplicationEvents.vb geprüft wird.

    VB.NET-Quellcode

    1. Namespace My
    2. Partial Friend Class MyApplication
    3. Private WithEvents MyDomain As AppDomain = AppDomain.CurrentDomain
    4. Private Function MyDomain_AssemblyResolve(ByVal sender As Object, ByVal args As System.ResolveEventArgs) As System.Reflection.Assembly Handles MyDomain.AssemblyResolve
    5. 'Dieser Aufruf funktioniert problemlos
    6. If args.Name.Contains("Qios") Or args.Name.Contains("DevSuite") Then
    7. Return (System.Reflection.Assembly.Load(My.Resources.Qios_DevSuite_Components))
    8. Else
    9. Return Nothing
    10. End If
    11. 'Diese Prüfung wird anscheinend vollständig ignoriert
    12. If args.Name.Contains("Krypton") Then
    13. Return (System.Reflection.Assembly.Load(My.Resources.ComponentFactory_Krypton_Toolkit))
    14. Else
    15. Return Nothing
    16. End If
    17. End Function
    18. End Class
    19. End Namespace


    Wenn ich die Prüfung für die Krypton dll an erster Stelle im Code setze findet er die Qios-dll nicht. Wieso springt er denn aus dem Code raus nach der ersten IF-Abfrage ?

    Muss ich eventuell eine ApplicationEvents1.vb erstellen und die zweite dll seperat laden lassen?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Sev7eNup“ ()

    Sev7eNup schrieb:

    Wieso springt er denn aus dem Code raus nach der ersten IF-Abfrage ?

    Wegen:
    If gefunden then
    '
    else
    return
    endif

    Das return beendet ja die Funktion. Das zweite IF wird also NIE aufgerufen. Einfach alle "else return nothing" weglassen und das return nothing stattdessen als letzten Befehl in die Funktion. Denn nur wenn alle IFs fehlschlagen kommt man ja dahin.
    Danke für die schnellen Antworten.

    Er scheint nun tatsächlich beide dlls zu laden. Allerdings hängt er sich beim Versuch auf. Man sieht sogar wie die ersten controls entstehen, aber das wars dann.

    VB.NET-Quellcode

    1. Namespace My
    2. Partial Friend Class MyApplication
    3. Private WithEvents MyDomain As AppDomain = AppDomain.CurrentDomain
    4. Private Function MyDomain_AssemblyResolve(ByVal sender As Object, ByVal args As System.ResolveEventArgs) As System.Reflection.Assembly Handles MyDomain.AssemblyResolve
    5. If args.Name.Contains("Krypton") Then
    6. Return (System.Reflection.Assembly.Load(My.Resources.ComponentFactory_Krypton_Toolkit))
    7. End If
    8. If args.Name.Contains("Qios") Or args.Name.Contains("DevSuite") Then
    9. Return (System.Reflection.Assembly.Load(My.Resources.Qios_DevSuite_Components))
    10. End If
    11. Return Nothing
    12. End Function
    13. End Class
    14. End Namespace


    Hat wahrscheinlich auch was mit beiden returns zu tun?! Oder vllt sogar damit, dass beide DLLs für die Erstellung der Controls verwendet werden und diese sich beißen?
    Ich habe mir die Punkte unter dem Link durchgelesen. Leider wird dort nicht auf ApplicationEvents eingegangen. Die 3 Lösungsansätze sind, wenn ich das richtig einschätze, doch recht weit von meinem entfernt. Durch die Beispiele blicke ich auch nicht wirklich durch.

    Gibt es denn eine Möglichkeit beide dlls mit applicationevents aufzurufen oder ist mein Ansatz schon falsch?

    Ich verstehe nicht, wieso die Ressourcen nicht ordnungsgemäß geladen werden können. Schließlich arbeitet er doch erst die 1. Abfrage und dann die 2. Abfrage ab.

    edit1: Mir ist gerade klar geworden, dass er NICHT in die zweite Abfrage springt, sofern die erste Abfrage durch return etwas zurückgibt, da er dadurch die Funktion beendet... Stehe aber nach wie vor vor dem selben Problem.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Sev7eNup“ ()

    Ich bin nun nach ein wenig Suchen auf folgenden Link gestoßen:

    dotnetbase.de/verweise-ressourcen-laden-t8.html

    Wenn ich das richtig verstehe, geht der Autor im Prinzip genau so vor wie ich. Jetzt schreibt er aber am Ende des Beitrags, dass durch erweitern der IF-Abfrage weitere Assemblies hinzugefügt werden können... Wie soll das gehen, wenn nur ein return-Wert wiedergegeben werden kann und er dann aus der Funktion raus springt?
    Danke für die Antwort, aber das hat mit meinem Problem nichts zu tun. Ich möchte lediglich Dll Dateien die sich in den Ressourcen des Programms befinden beim Programmstart laden, da sie erforderlich für controls etc. sind. Das ganze mittels ApplicationEvents, siehe oben.