JTLwawiExtern.dll einbinden

In diesem Abschnitt finden Sie eine Erklärung zur Einbindung der JTLwawiExtern.dll. Im Beispielprojekt können Sie sich das gesamte
Projekt anschauen.

Schritt 1:

Öffnen Sie Ihr Projekt in Ihrem Visual Studio.

Schritt 2:

Klicken Sie mit rechts auf Verweise und anschließend auf Verweis hinzufügen.

Schritt 3:

Klicken Sie nun auf der linken Seite auf Durchsuchen und anschließend auf den Durchsuchen Button unten am Dialog-Fensterrand.
Suchen Sie nun die JTLwawiExtern.dll in dem JTL-Software Verzeichnis . Klicken Sie anschließend auf "Ok".

Standardpfad (x64-System): C:\Program Files (x86)\JTL-Software
Standardpfad (x86-System): C:\Program Files (x86)\JTL-Software

Schritt 4:

Nun müssen Sie in den Eigenschaften des Verweis für die JTLwawiExtern.dll die Lokale Kopie auf False setzen, was standardmäßig auf True gesetzt ist.
Dies ist für die nächsten Schritte notwendig, da nur über das Einbinden des Verweis nicht alle von der JTLwawiExtern.dll benötigten Verweise nachgeladen werden können,
da das Projekt nur im Projektverzeichnis oder im Global Assembly Cache nach den DLL's sucht und nicht dort wo sich die DLL lokal auf dem Rechner befindet.

Schritt 5:

Zusätzlich muss die DLL dynamisch zur Laufzeit eingebunden werden. Dazu müssen Sie die folgenden Methoden verwenden, welche die Registry nach dem Installationspfad der Wawi durchsuchen.

Die Methode FindInstallLocation() übergibt der Methode FindUninstallSubkey() den Basis-Registry-Zweig für 32-Bit oder 64-Bit Systeme.
In der Methode FindUninstallSubkey() wird im übergebenen Registryzweig nach dem Pfad zur Installation der Wawi gesucht und falls dieser gefunden wird, wird er zurück gegeben.

private string FindInstallLocation()
{
     var cLocation = FindUninstallSubkey(@"Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall");
     if (!string.IsNullOrEmpty(cLocation))
          return cLocation;
     return FindUninstallSubkey(@"Software\Microsoft\Windows\CurrentVersion\Uninstall");
}

private string FindUninstallSubkey(string baseKey)
{
     var oKey = Registry.LocalMachine.OpenSubKey(baseKey);
     if (oKey == null) 
          return null;
     return oKey.GetSubKeyNames()
                   .Select(oKey.OpenSubKey)
                   .Where(oSubKey => string.Equals("JTL-Wawi", oSubKey.GetValue("DisplayName")))
                   .Select(oSubKey => Convert.ToString(oSubKey.GetValue("InstallLocation")))
                   .FirstOrDefault();
}

Schritt 6:
Des Weiteren sollten Sie prüfen, ob die Versionsnummer der lokal gefundenen JTLwawiExtern.dll mindestens genau so groß ist, wie die der über Verweise
eingebundenen JTLwawiExtern.dll. Dies ist notwendig, da man nicht davon ausgehen kann, dass in einer kleineren Version die gleichen Methoden enthalten
sind, wie in einer mindestens genau so großen Version.
Allerdings muss die Version der über Verweise eingebundenen JTLwawiExtern.dll per Hand angegeben werden. Die Version findet man unter den Eigenschaften
der eingebundenen DLL.

private bool ValidExternDllVersion()
{
    string externDllPath = Path.Combine(_wawiPath, "JTLwawiExtern.dll");
    Version externDllVersion = new Version(FileVersionInfo.GetVersionInfo(externDllPath).FileVersion);
    Version eingebundeneExternDllVersion = new Version(1, 1, 0, 9);
    if (externDllVersion < eingebundeneExternDllVersion)
        return false;
    return true;
}

Schritt 7:
Mittels der folgenden Programmzeile müssen Sie ein Event für den Resolver abbonieren, welches es ermöglicht die benötigten DLL's zur Laufzeit nachzuladen.

Das Abbonieren des Events im Resolver muss zwingend vor dem Auführen von Code, der auf die JTLwawiExtern.dll zugreift, stattfinden, da es ansonsten zu Laufzeitfehlern kommen kann.
Falls kein Installationspfad gefunden werden kann oder die Versionsprüfung aus Schritt 6 fehlschlägt sollte das Programm beendet werden, da man nicht auf die DLL's zugreifen kann.

AppDomain.CurrentDomain.AssemblyResolve += LoadAssemblys;

Das Event LoadAssemblys() lädt dann aus dem Installationspfad der Wawi, hier im Feld _wawiPath gespeichert, die benötigten DLL's nach, sofern diese existieren.

private Assembly LoadAssemblys(object sender, ResolveEventArgs args)
{
     string folderPath = Path.GetDirectoryName(this._wawiPath);
     string assemblyPath = Path.Combine(folderPath, string.Format("{0}.dll", new AssemblyName(args.Name).Name));
     if (!File.Exists(assemblyPath)) 
          return null;
     Assembly assembly = Assembly.LoadFrom(assemblyPath);
     return assembly;
}

Schritt 8:
Nun müssen Sie in Ihrer Klasse die using-Directive für die JTLwawiExtern.dll hinzufügen.

Schritt 9:
Nun müssen Sie ein Objekt der Klasse CJTLwawiExtern erstellen, das Ihnen ermöglicht die Methoden der JTLwawiExtern.dll zu nutzen.

private readonly CJTLwawiExtern _wawiExtern;

public Worker()
{
     this._wawiExtern = new CJTLwawiExtern();
}

Verweise_hinzufuegen.png (19,605 KB) Simon Käufling, 21.06.2016 09:37

Verweise_durchsuchen.png (14,677 KB) Simon Käufling, 21.06.2016 09:40

Verwiese_lokale_kopie.png (34,445 KB) Simon Käufling, 21.06.2016 09:47

Verweise_usingdirective.png (3,155 KB) Simon Käufling, 21.06.2016 10:38