Externe DLL einbinden

  • VB.NET

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

    Externe DLL einbinden

    Hallo zusammen,

    ich möchte gerne eine externe DLL einbinden. Dazu habe ich folgende Beschreibung gefunden, die aber dummerweise für C# ist.
    developer.jtl-software.de/Wiki/JTLwawiExterndll_einbinden/

    Ich soll das ganze nun in ein VB.net Programm einbinden und einen Workflow mit meinem Programm aufrufen.

    Bisher habe ich die DLL im Projekt als Verweis eingebunden und "Lokal Kopie" auf FALSE gesetzt
    Dann habe ich als Imports folgendes verwendet (Imports JTLwawiExtern)
    und zuletzt folgendes aufgerufen: Dim CJTLwawiExtern = New CJTLwawiExtern

    Ich erhalte dann aber immer den Fehler, dass die DLL nicht gefunden werden konnte. Diese ist aber ganz klar an dem eingebundenen Ort.
    Ich hoffe Ihr könnt mir helfen.

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    lisa23 schrieb:

    die aber dummerweise für C# ist.
    Warum die Ausrede "Das ist aber C#" nicht gilt
    Finde einen Konverter und benutze ihn.
    Einen findest Du in meiner Signatur.
    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!
    ? Die Anleitung aus Post#1 ist eine VB.NET-kompatible, genauso wie der dortige Code, von daher ist Post#2 quatsch. Alles Wichtige wurde laut Beschreibung der verlinkten Anleitung für den Anfang übernommen.
    @lisa23: Welche .NET-Framework-Version ist für das Projekt eingestellt? Teste mal 4.7.2 oder 4.8. Teste auch mal, ob es an der Ziel-CPU-Einstellung liegt.
    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.
    DANKE! Ich habe verschiedene .NET Versionen und auch die Ziel CPU habe ich auf x86 und x64 gestellt, geht leider nicht.

    Folgender Fehler kommt
    System.IO.FileNotFoundException: "Die Datei oder Assembly "JTLwawiExtern, Version=1.5.29.3, Culture=neutral, PublicKeyToken=null" oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden."
    @lisa23 Möglicherweise fehlt da eine Satelliten-DLL oder eine Installation.
    Zieh mal die DLL auf den Dependency Walker.
    Der zeigt dann an, was fehlt.
    ============

    VaporiZed schrieb:

    von daher ist Post#2 quatsch.
    Hast Du eine andere Version?
    Ich sehe da ausschließlich C#-Code.
    ============
    @lisa23 Wo finde ich die DLL?
    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!

    RodFromGermany schrieb:

    Ich sehe da ausschließlich C#-Code
    der für das hiesige Problem aber nicht relevant ist. Es geht erstmal nur um die erfolgreiche Einbindung der DLL. Wie das Ganze dann weiterverwendet wird, ist in C# beschrieben, das ist richtig. Aber soweit sind wir noch lange nicht.
    @lisa23: Ich gehe mal davon aus, dass Du die JTL-Warenwirtschaftssoftware bei Dir komplett installiert hast? Denn die DLL allein würde natürlich nicht reichen. Kannst Du mal zur Sicherheit einen Screenshot über [+ Erweiterte Antwort] für den DLL-Verweis hochladen? Wenn da bei Version z.B. 0.0.0.0 steht, ist schon mal der Wurm drin.
    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.
    Bilder bitte zukünftig nur forenintern über [+ Erweiterte Antwort] hochladen. Viele User hier mögen keine externen Bildhoster und die wiederum tendieren manchmal dazu, irgendwann Bilder zu löschen.
    Von wegen Profit und Zuckerberg Prophet und Berg: Was passiert, wenn Du Dein Programm, was ja sicherlich an sich kompiliert, im Verzeichnis der DLL hast und es startest?
    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 Was macht diese Exe?
    Installiert sie ein Haufen "unnützes" Zeugs?
    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!
    @lisa23 Ich will keine Warenwirtschaft installieren, sondern die Implementierung dieser DLL testen.
    Pack mal lieber die DLL in eine ZIP und häng die an einen Post.
    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,

    trifft ja genau mal meinen aktuellen Zweig in dem ich tätig bin - Entwickler für JTL Servicepartner.

    Wenn du alle nach Anweisung der Anleitung gemacht hast solltest du dir eine kleine Klasse gebaut haben:

    Spoiler anzeigen

    C#-Quellcode

    1. public class ValidateAssembly
    2. {
    3. private string _wawiPath;
    4. public bool IsValid { get; private set; }
    5. public ValidateAssembly()
    6. {
    7. this.IsValid = false;
    8. ValidateAndLoadAssemblys();
    9. }
    10. private void ValidateAndLoadAssemblys()
    11. {
    12. _wawiPath = FindInstallLocation();
    13. if (!string.IsNullOrWhiteSpace(this._wawiPath) && ValidExternDllVersion())
    14. {
    15. this.IsValid = true;
    16. AppDomain.CurrentDomain.AssemblyResolve += LoadAssemblys;
    17. }
    18. else
    19. {
    20. this.IsValid = false;
    21. }
    22. }
    23. /// <summary>
    24. /// Sucht in der Registry nach einem Uninstall-Subkey für die Wawi
    25. /// </summary>
    26. /// <param name="baseKey">Basis-Registry-Zweig (für 32bit oder 64bit-Systeme)</param>
    27. /// <returns>Der Pfad zur Installation der Wawi</returns>
    28. private string FindUninstallSubkey(string baseKey)
    29. {
    30. var oKey = Registry.LocalMachine.OpenSubKey(baseKey);
    31. if (oKey == null) return null;
    32. return
    33. oKey.GetSubKeyNames()
    34. .Select(oKey.OpenSubKey)
    35. .Where(oSubKey => string.Equals("JTL-Wawi", oSubKey.GetValue("DisplayName")))
    36. .Select(oSubKey => Convert.ToString(oSubKey.GetValue("InstallLocation")))
    37. .FirstOrDefault();
    38. }
    39. /// <summary>
    40. /// Sucht der Registry (sowohl 32bit als auch 64bit) nach dem Installationsort für die Wawi
    41. /// </summary>
    42. /// <returns>Wawi-Installationsort</returns>
    43. private string FindInstallLocation()
    44. {
    45. var cLocation = FindUninstallSubkey(@"Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"); //32bit
    46. if (!string.IsNullOrEmpty(cLocation))
    47. return cLocation;
    48. return FindUninstallSubkey(@"Software\Microsoft\Windows\CurrentVersion\Uninstall"); //64bit
    49. }
    50. private bool ValidExternDllVersion()
    51. {
    52. string externDllPath = Path.Combine(_wawiPath, "JTLwawiExtern.dll");
    53. Version externDllVersion = new Version(FileVersionInfo.GetVersionInfo(externDllPath).FileVersion);
    54. Version eingebundeneExternDllVersion = new Version(1, 5, 18, 2); //Eingebette Version manuell pflegen
    55. return externDllVersion >= eingebundeneExternDllVersion;
    56. }
    57. private Assembly LoadAssemblys(object sender, ResolveEventArgs args)
    58. {
    59. string folderPath = Path.GetDirectoryName(this._wawiPath);
    60. string assemblyPath = Path.Combine(folderPath, string.Format("{0}.dll", new AssemblyName(args.Name).Name));
    61. if (!File.Exists(assemblyPath)) return null;
    62. Assembly assembly = Assembly.LoadFrom(assemblyPath);
    63. return assembly;
    64. }
    65. }


    In Zeile 61 die Version anpassen der WaWi ab wann alles ok ist.

    und dann brauchst du nur noch zu checken ob alles gefunden ist:
    Spoiler anzeigen

    C#-Quellcode

    1. ​ ValidateAssembly validateAssembly = new ValidateAssembly();
    2. if (!validateAssembly.IsValid)
    3. return;


    Und kannst dir dann deine JTLWawiExtern Instanz machen:
    Spoiler anzeigen

    C#-Quellcode

    1. CJTLwawiExtern _wawiDll = new CJTLwawiExtern();


    und kannst ganz normal drauf zugreifen.

    @RodFromGermany das geht leider nicht. Diese ExternDLL kannst du nur verwenden wenn die WaWi installiert ist da diese noch weitere DLL´s aus dem Installationsverzeichnis nachlädt.
    Sonst ist die DLL nicht nutzbar.
    Grüße , xChRoNiKx

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

    xChRoNiKx schrieb:

    das geht leider nicht
    Also das, was ich in Post #5 befürchtet habe.
    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!
    Ja die JTLwawiExtern DLL ist nur ein Wrapper soweit ich weiß. Man muss alle anderen DLL´s aus dem Verzeichnis der Wawi nachladen damit man auf die genannten funktionen
    der ExternDLL auch ordnungsgemäß zugreifen kann.

    Das ist so weil diese WaWi damals in C++ oder C geschrieben wurde und der innere Kern das immer noch ist. Die sind aber seit geraumen Versionen dabei das ganze in C# zu schreiben
    und tauschen teile aus. Daher kommt dann auch die ExternDLL um über den Wrapper halt auf die bestimmten Funktionen zugreifen zu können.
    Ausschnitt aus ILSpy der References:


    der braucht halt die ganzen anderen dlls
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    @xChRoNiKx OK.
    @lisa23 Dann bin ich jetzt hier leider draußen. Sorry.
    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!

    VB.NET-Quellcode

    1. Imports JTLwawiExtern
    ;)
    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.
    Sorry wenn ich nerve, aber ich will es jetzt auch hinbekommen.

    An der Stelle scheine ich noch einen Fehler zu haben
    AppDomain.CurrentDomain.AssemblyResolve += AddressOf LoadAssemblys

    Ich bekomme auch immer noch den Fehler, dass die DLL nicht gefunden werden kann.
    Die Klasse habe ich in meine Hauptform geschrieben, das sollte aber ja kein Problem darstellen.