![]() |
Assembly bedingt einbinden
Guten Tag,
Ich hätte da mal folgende Frage: Ich habe eine Anwendung, die auf eine Assembly-dll zugreift. Diese dll ist in verschiedenen Versionen verfügbar, die jeweils komplett anders funktionieren. Leider weiss ich nicht, welche der dlls beim Anwender installiert sein werden. Gibt es eine Möglichkeit eine Assembly bedingt (je nachdem welche vorhanden ist) einzubinden? |
AW: Assembly bedingt einbinden
Du kannst mit der App-config steuern, welche Version eines Assemblies genutzt werden soll, wenn mehrere vorhanden sein sollten.
Wenn diese anders anprogrammiert werden müssen, so müsstest Du von dem geladenen Assembly die Version auslesen und entsprechend verzweigen. |
AW: Assembly bedingt einbinden
Ich danke dir für die Antwort.
Aber genauer gesagt geht es mehr darum, verschiedene Assemblys einzubinden. Also entweder x.dll oder y.dll. Die Dlls haben auch unterschiedliche Namen/Namensräume. Das Problem dabei: wenn ich beide dlls zu den Verweisen hinzufüge, aber nur eine vorhanden ist, kommt beim Start der Anwendung (bzw. kurz davor) Die Meldung "Die Assembly 'x' konnte nicht geladen werden" (oder so ähnlich, habs nicht im Kopf) |
AW: Assembly bedingt einbinden
Ah. Das ist nicht so einfach. Du musst das dann dynamisch einladen mittels Assembly.Load().
Problematisch ist dann lediglich, dass Du eben keine Referenzen im Code hast, also musst Du die Klassen und Methoden mittels Reflection ermitteln und aufrufen. Ist ziemlich eklig, wenn Du kein Interface hast gegen das Du programmieren kannst. Die würde ich dann erstellen und Wrapperklassen schreiben die die API dann 1:1 per Reflection rausreichen. Ne andere Idee hab ich leider nicht, wenn Du keinen Einfluss auf die Fremd-Assemblies hast. |
AW: Assembly bedingt einbinden
Mit Interfaces ist das aber obersimpel
Code:
public IMyInterface GetInstanceFromFile (string filename)
{ Assembly assembly = Assembly.LoadFile(filename); foreach (Type type in assembly.GetTypes()) if (type.IsClass && type.IsPublic) if (type.GetInterfaces().Contains(typeof(IMyInterface))) return (IMyInterface)Activator.CreateInstance(type); } |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz