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

Projekt öffnen

Öffnen Sie Ihr Projekt in Ihrem Visual Studio.
2

Verweis hinzufügen

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

DLL auswählen

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\JTL-Software
4

Lokale Kopie deaktivieren

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 DLLs sucht und nicht dort, wo sich die DLL lokal auf dem Rechner befindet.
5

Installationspfad ermitteln

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ückgegeben.
private string FindInstallLocation()
{
    var cLocation = FindUninstallSubkey(@"Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall");
    return !string.IsNullOrEmpty(cLocation) ? cLocation : 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 => Equals("JTL-Wawi", oSubKey.GetValue("DisplayName")))
        .Select(oSubKey => Convert.ToString(oSubKey.GetValue("InstallLocation")))
        .FirstOrDefault();
}
6

Versionsprüfung

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.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()
{
    var externDllPath = Path.Combine(this._wawiPath, "JTLwawiExtern.dll");
    var externDllVersion = new Version(FileVersionInfo.GetVersionInfo(externDllPath).FileVersion);
    var eingebundeneExternDllVersion = new Version(1, 1, 0, 9);
    return externDllVersion >= eingebundeneExternDllVersion;
}
7

Resolver abonnieren

Mittels der folgenden Programmzeile müssen Sie ein Event für den Resolver abonnieren, welches es ermöglicht die benötigten DLLs zur Laufzeit nachzuladen.
Das Abonnieren des Events im Resolver muss zwingend vor dem Ausfü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 DLLs zugreifen kann.
AppDomain.CurrentDomain.AssemblyResolve += this.LoadAssemblys;
Das Event LoadAssemblys() lädt dann aus dem Installationspfad der Wawi, hier im Feld _wawiPath gespeichert, die benötigten DLLs nach, sofern diese existieren.
private Assembly LoadAssemblys(object sender, ResolveEventArgs args)
{
    var folderPath = Path.GetDirectoryName(this._wawiPath);
    var assemblyPath = Path.Combine(folderPath ?? throw new InvalidOperationException(), $"{new AssemblyName(args.Name).Name}.dll");
    if (!File.Exists(assemblyPath))
        return null;
    var assembly = Assembly.LoadFrom(assemblyPath);
    return assembly;
}
8

using-Directive hinzufügen

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

CJTLwawiExtern-Objekt erstellen

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();
}