Externe DLL einbinden

  • VB.NET

Es gibt 38 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Poste bitte deinen kompletten Code der da Relevant ist und welche Version der Wawi ist installiert?
    Du musst unbedingt schauen das die Version die du in deinem Code angibst größer oder gleich der installierten ist.

    Was sagt die Fehlermeldung bei der geposteten Zeile?
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Steinigt mich nicht :)
    Version habe ich die aktuellste, das habe ich auch in der Klasse unten so angepasst.


    VB.NET-Quellcode

    1. Imports System.Data.SqlClient
    2. Imports System.IO
    3. Imports System.Windows.Forms
    4. Imports System.Drawing
    5. Imports System.Text.RegularExpressions
    6. Imports Microsoft.Win32
    7. Imports System.Linq
    8. Imports System.Reflection
    9. Imports System.Diagnostics
    10. Imports JTLwawiExtern
    11. Public Class Form1
    12. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    13. Dim CJTLwawiExtern = New CJTLwawiExtern()
    14. End Sub
    15. End Class
    16. Public Class ValidateAssembly
    17. Private _wawiPath As String
    18. Public Property IsValid As Boolean
    19. Public Sub New()
    20. Me.IsValid = False
    21. ValidateAndLoadAssemblys()
    22. End Sub
    23. Private Sub ValidateAndLoadAssemblys()
    24. _wawiPath = FindInstallLocation()
    25. If Not String.IsNullOrWhiteSpace(Me._wawiPath) AndAlso ValidExternDllVersion() Then
    26. Me.IsValid = True
    27. AppDomain.CurrentDomain.AssemblyResolve += AddressOf LoadAssemblys
    28. Else
    29. Me.IsValid = False
    30. End If
    31. End Sub
    32. Private Function FindUninstallSubkey(ByVal baseKey As String) As String
    33. Dim oKey = Registry.LocalMachine.OpenSubKey(baseKey)
    34. If oKey Is Nothing Then Return Nothing
    35. 'Return oKey.GetSubKeyNames().[Select](oKey.OpenSubKey).Where(Function(oSubKey) String.Equals("JTL-Wawi", oSubKey.GetValue("DisplayName"))).[Select](Function(oSubKey) Convert.ToString(oSubKey.GetValue("InstallLocation"))).FirstOrDefault()
    36. End Function
    37. Private Function FindInstallLocation() As String
    38. Dim cLocation = FindUninstallSubkey("Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall")
    39. If Not String.IsNullOrEmpty(cLocation) Then Return cLocation
    40. Return FindUninstallSubkey("Software\Microsoft\Windows\CurrentVersion\Uninstall")
    41. End Function
    42. Private Function ValidExternDllVersion() As Boolean
    43. Dim externDllPath As String = Path.Combine(_wawiPath, "JTLwawiExtern.dll")
    44. Dim externDllVersion As Version = New Version(FileVersionInfo.GetVersionInfo(externDllPath).FileVersion)
    45. Dim eingebundeneExternDllVersion As Version = New Version(1, 5, 31, 3)
    46. Return externDllVersion >= eingebundeneExternDllVersion
    47. End Function
    48. Private Function LoadAssemblys(ByVal sender As Object, ByVal args As ResolveEventArgs) As Assembly
    49. Dim folderPath As String = Path.GetDirectoryName(Me._wawiPath)
    50. Dim assemblyPath As String = Path.Combine(folderPath, String.Format("{0}.dll", New AssemblyName(args.Name).Name))
    51. If Not File.Exists(assemblyPath) Then Return Nothing
    52. Dim assembly As Assembly = Assembly.LoadFrom(assemblyPath)
    53. Return assembly
    54. End Function
    55. End Class
    Lass Dir mal bitte per MessageBox.Show anzeigen, was genau in _wawiPath drinsteckt. Das sieht ziemlich verdächtig falsch aus.
    Zeile#37 geht in VB.NET nicht. Da musst Du mit AddHandler arbeiten.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    ...will heißen, erstmal ne Instanz kreieren, meinst Du v.a. (?)

    @xChRoNiKx:
    Aus dem SubKey Software\Microsoft\Windows\CurrentVersion\Uninstall :?:
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    ...will heißen, erstmal ne Instanz kreieren, meinst Du v.a. (?)

    @xChRoNiKx:
    Aus dem SubKey Software\Microsoft\Windows\CurrentVersion\Uninstall :?:


    Nein bei mir ist es (es kommt drauf an ob 32/64bit):

    Und er findet das in meiner Testumgebung super, genauso auf Kundenserver / Rechner.
    Das ist der gleiche Code den ich auf mehreren Apps nutze.
    Evtl geht da was mit VB.NET nicht richtig? Aber VB.Net ist nicht meine Stärke.

    Die relevante stelle zum raussuchen wurde auskommentiert im gezeigtem Code von @lisa23
    Und ja es ist der Pfad siehe Screenshot.

    Ich kann leider das Zeug da für weitere Behebung in VBnet nicht testen. Ich nutze da auch nur einen Converter.
    Aufjedenfall darf da die Zeile 46 nicht auskommentiert sein.

    und man muss bevor man die DLL dann instanziert eine Instanz von ValidateAssembly erstellen und prüfen ob isValid true ist.
    Denn ValidateAssembly lädt dann erst alle weiteren DLLs.

    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

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

    Das war mein Problem. Der Dateipfad steht nicht in dem Uninstall-Knoten, sondern in einem Unterknoten davon. Und daher scheitert auch die Einbindung. Das meinte ich mit _wawiPath mal ausgeben lassen. Da kommt dann totaler Murks raus.
    @lisa23: Jetzt wird's aber bedenklich mit der Frage, wie man ValidateAssemly instanziiert. Wie würdest Du ein Objekt der Klasse X instanziieren? Das ist absolut notwendiges Grundlagenwissen!

    Ungeprüft:

    VB.NET-Quellcode

    1. Dim NameOfAllSubKeys = oKey.GetSubKeyNames()
    2. Dim NameOfTargetSubKey = NameOfAllSubKeys.FirstOrDefault(Function(x) x.StartsWith("JTL-Wawi"))
    3. Dim TargetSubKey = oKey.OpenSubKey(NameOfTargetSubKey)
    4. Dim InstallLocation = TargetSubKey.GetValue("InstallLocation")
    5. Return InstallLocation


    @xChRoNiKx: So, mein Internetzugang hing …
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Richtig und mit der Funktion die dann aufgerufen wird mit dem UnistallPfad:

    C#-Quellcode

    1. private string FindUninstallSubkey(string baseKey)
    2. {
    3. var oKey = Registry.LocalMachine.OpenSubKey(baseKey);
    4. if (oKey == null) return null;
    5. return
    6. oKey.GetSubKeyNames()
    7. .Select(oKey.OpenSubKey)
    8. .Where(oSubKey => string.Equals("JTL-Wawi", oSubKey.GetValue("DisplayName")))
    9. .Select(oSubKey => Convert.ToString(oSubKey.GetValue("InstallLocation")))
    10. .FirstOrDefault();
    11. }


    Sucht er genau den Teil für die JTL-Wawi. Das ist schon richtig. Siehe meinen Code oben in Post 13.
    Lisa hat hier aber den relevanten teil bei sich auskommentiert.

    Hier mit Bild:

    Der Pfad der rauskommt ist genau richtig.
    Sie muss nur die Abfrage da in VB.NET richtig rein machen die sie auskommentiert hat dann findet er auch den Pfad. Das habe ich
    schon paar mal erwähnt nu.

    @VaporiZed zu deinem EDIT ja so gehts natürlich auch. Kommt auf das gleiche hinaus wie meins.
    Dann fehlt nur noch die Instanzierung von ValidateAssembly und der Prüfung ob isValid = true ist.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

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

    Ok, das ist schon mal die richtige Variante zum Instanziieren von ValidateAssembly (obwohl es mit Dim ValidateAssembly As New ValidateAssembly noch kürzer geht).
    Wie vor 10 Posts (Post#23) geschrieben, Du musst AddHandler verwenden. Besteht aus AddHandler, dem Event und der Adresse der Prozedur, die als EventHandler dienen soll, also aufgerufen werden soll, wenn das angegebene Event gefeuert wird. Das ergibt:
    AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf LoadAssemblys
    (ungeprüft, sollte aber laufen)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    lisa23 schrieb:

    MsgBox(ValidateAssembly.IsValid)
    Machst Du Option Strict On :!:
    Visual Studio - Empfohlene Einstellungen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi,

    hast du sicher auch die richtige Version als Verweis drin?
    In deinem Screenshot in Post 7 zeigt es Version 1.5.29.3 auf die du Verwiesen hast.
    Allerdings sagst du im Code im Post 22 Zeile 58 das die Version größer gleich 1.5.31.3 sein soll.

    Schau mal bitte genau nach welche Version du als Verweis hinzugefügt hast. Falls eine alte dann lösche den Verweis und füge
    den neu hinzu. Normalerweise sollte er nicht true zurückgeben dann aber ansonsten kann ich mir den Fehler nicht erklären denn
    er sollte dann die DLL´s alle aus dem Wawi Pfad laden
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Und beachte nochmal Post#23!
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.