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\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");
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();
}
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()
{
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;
}
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 += this.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)
{
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;
}
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();
}