Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   .NET-Framework (managed code) (https://www.delphipraxis.net/79-net-framework-managed-code/)
-   -   C# Assembly bedingt einbinden (https://www.delphipraxis.net/161659-assembly-bedingt-einbinden.html)

WM_CLOSE 14. Jul 2011 15:39

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?

Phoenix 14. Jul 2011 21:23

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.

WM_CLOSE 15. Jul 2011 16:54

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)

Phoenix 15. Jul 2011 16:58

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.

FredlFesl 20. Jul 2011 05:48

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 09:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz