Laden...

Drittanbieter Assembly laden

Letzter Beitrag vor 2 Jahren 3 Posts 281 Views
Drittanbieter Assembly laden

Servus,

ich bin noch recht neu im c#/NET Bereich. Ich muss eine .NET Assembly eines Drittanbieters bei mir verwenden. Leider installiert der die Assembly nicht im GAC. Bei den Kunden bei denen meine Software auch laufen muss, kann ich also nicht sagen in welchem Pfad die Installation liegt.

Für die Entwicklung habe ich die Assembly einfach in das Projekt aufgenommen (verweis), klappt so weit, bei der Erzeugung wird die DLL mit 2 weiteren abhängigen DLLs in das Ausgabeverzeichnis gepackt.
Allerdings will ich die nicht mit ausliefern - wie schaffe ich es, dass meine Anwendung die DLL aus dem korrekten Verzeichnis verwendet?

Was ich versucht habe:
* assemblyBinding über die app.config: gilt, wenn ich das richtig verstanden habe, aber nur für Subfolder, für mich also eher nicht geeignet
* ResolveEventHandler: Dort habe ich versucht mit
Assembly assembly = Assembly.LoadFrom(@"c:\x\y.dll");
return assembly
die dll zu laden, Anwendung bricht aber mit dem Fehler ab, dass der die DLL nicht findet (Die Datei oder Assembly "yDLL, Version 1.0.0.0, Culture=neutral, PublikKey Token = Null" oder eine ihrer Abhängigkeit davon wurde nicht gefunden.

* PATH-Systemvariable geändert während der Laufzeit - funktioniert ebenfalls nicht.

Hat jemand ne Idee was ich falsch mache?

*Hinweis: die explizite Pfadangabe bei Assemlby.LoadFrom soll nur der Anschauung dienen 🙂
Grüße
Lemmy

Bist du dir sicher, dass deine Pfadangabe stimmt? Aus Versehen den falschen Pfad kopiert?
Hat die DLL vielleicht andere Abhängigkeiten die nicht aufgelöst werden können? -> Dependency Walker

Ansonsten könntest du in der Installationsroutine deiner Software, nach der Drittanbieter Software suchen (vielleicht trägt die sich in die Registry ein?) und dann einen Symlink in deinem Installationsordner erstellen der auf die Assembly der Drittanbieter Software zeigt.

Servus,

ja, Pfadangabe stimmt, eben nochmal kontrolliert.

ja, die DLL hat 2 weitere als Abhängigkeiten, aber auch wenn ich die über den Resolver lade, klappt das nicht..

ok, mea culpa... der Resolver wird natürlich von jeder DLL einzeln aufgerufen. Ich habe jetzt die dlls des Anwendungsverzeichnisses des Partnes alle in eine Liste gepackt


foreach (string file in Directory.EnumerateFiles(xpath, "*.dll"))
            {
                try
                {
                    AssemblyName name = AssemblyName.GetAssemblyName(file);
                    assemblyMapping.Add(name.FullName, file);
                }

und kann dann im Resolver einfach auflösen:


            if (assemblyMapping.TryGetValue(args.Name, out file))
            {
                return Assembly.LoadFrom(file);
            }
            return null;

Danke für den Denkanstoß 🙂