Programmausgabe bei Verwendung von Sage-DLLs

bseidel

Mitglied
Hallo,
ich habe ein Problem bei der Entwicklung mit Gebrauch von Sage-DLLs. Ich möchte eine komplett für sich selbst laufende .NET-Anwendung mit einem Setup in ein eigenes Verzeichnis auf das Zielsystem installieren und dort starten. In meiner Anwendung habe ich verschiedene Sagede-Verweise.
Punkt 1 ist, sobald ich auf Sage-DLLs verweise und über das Developer Addin im VS2019 die Funktion "Build-Ausgabe akutelles Projekt" auslöse, setzt er automatisch alles Ausgaben auf den Shared-Ordner.
Punkt 2 und Hauptpunkt ist, wenn ich die Anwendung auf dem Zielsystem installiere und im erstellten Ordner meine Anwendung starte, bekomme ich einen komischen Fehler : "
Sagede.OfficeLine.Data.GenericDeviceConnectException: Die Datenbank, an der Sie sich anmelden möchten, wird von dieser Programmversion nicht unterstützt. Bitte verwenden Sie eine aktuelle Programmversion!

Datenbankname: Futron_Weska
aktuelle Datenbankversion: 9.0.5904
erwartete Datenbankversion: <= 9.0.5607".
Dieser behauptet, dass meine DB-Version zu neu(??) ist. Allerding ist sowohl die Entwicklungsmaschine, als auch das Zielsystem auf dem selbern Stand der Sage-Software und der Sage-Datenbank. Außerdem ist zu erwähnen, wenn ich ganz plump meine .exe in den Shared Ordner schiebe, hat er kein Problem mehr, was mich vermuten lässt, dass er irgendein Problem mit Dateien hat, die in meinen Verweisen und somit im Installationsordner nicht vorhanden sind.

Lange Rede, kurzer Sinn: Wie kann ich es schaffen, dass meine Software in einem eigenen Verzeichnis läuft, aber quasi ein Zugriff auf den kompletten Inhalt des Shared-Ordners besteht, sodass dieses Dateiproblem nicht wieder auftritt?

Vielen Dank schon einmal.
 
Hallo,

es besteht die Möglichkeit einzugreifen, wenn das Laden einer Assembly fehlschlägt.
Wenn man einen Ordner mit einer EXE hat, in dieser aber keine sage Dlls liegen, dann tritt dieses Ereignis ein.

An dieser Stelle kann man dann die notwendigen sage DLLs nachladen.

Hier der notwendige Code:

Im Hauptprogramm:

public class Program
{
static Program() => AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(LoadAssembliesFromFolder);

Plus die Funktion für das Nachladen:

static Assembly LoadAssembliesFromFolder(object sender, ResolveEventArgs args)
{
string folderPath = Path.Combine(SageInstallationPath(), "Shared");
string assemblyPath = Path.Combine(folderPath, $"{new AssemblyName(args.Name).Name}.dll");
if (!File.Exists(assemblyPath)) return null;
Assembly assembly = Assembly.LoadFrom(assemblyPath);
return assembly;
}

private static string SageInstallationPath()
{
try
{
RegistryKey key = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Wow6432Node\\Sage\\Office Line\\");
if (key != null)
foreach (string sub in key.GetSubKeyNames())
{
RegistryKey pathKey = key.OpenSubKey(sub);
if (pathKey != null && pathKey.GetValueNames().Count() > 0 && pathKey.GetValueNames().Contains("Root"))
return pathKey.GetValue("Root").ToString();
}
return null;
}
catch (Exception ex)
{
Console.WriteLine($"SageInstallationPath: {ex.Message}");
Console.ReadKey();
return null;
}
}


Nach einem Live-Update werden dann beim nächsten Start auch gleich die aktuellen DLLs geladen.
Eine Aktualisierung im EXE-Ordner ist nicht mehr notwendig :)

Viele Grüße
Joachim Dreher
 
Vielen Dank für die Antwort Herr Dreher. Das klingt nach einer sehr guten Idee.
Leider aber löst es noch nicht das Problem.
Beim Debuggen führt er die Funktion ohne Fehler aus, also gehe ich mal davon aus, dass sie funktioniert. Die Meldung bleibt nach wie vor.
 
Wichtig ist, dass die sage DLLs nicht in dem EXE-Ordner liegen.
Dort sollte nur Ihre Exe liegen und ggf. einige andere DLLs die Sie in Ihrem Projekt verwenden - nicht aber die sage dlls.
 
Zurück
Oben