Entwickler-Ecke

Basistechnologien - Dll für anderes Programm nutzbar machen


NemesisoD - Mi 16.09.15 10:15
Titel: Dll für anderes Programm nutzbar machen
Hallo zusammen,

ich habe eine eine Frage zum Thema DLLs.

Ich habe ein Programm geschrieben in welchem mehrere selbstgeschriebene DLLs enthalten sind.

Jetzt soll ich ein PlugIn für ein anderes Programm schreiben, welches auf die DLLs meines Programms zugreifen. Am einfachsten wäre es, wenn es über einen Verweis gehen könnte. Da der Pfad zur DLL aber unbekannt ist, und es nicht gewünscht ist das die DLLs im selben Ordner liegen, ist das (soweit ich weiß) nicht möglich.

Muss ich die DLLs jetzt via Assembly.Load einlesen und über getMethod etc. auf meine DLL zugreifen, oder gibt es einen schöneren Weg?

Vielen Dank.

Gruß,
Michael


Ralf Jansen - Mi 16.09.15 10:23

Assembly in den Global Assembly Cache legen oder den Pfad zu deiner Assembly in der App.config der deine Assembly benutzenden Applikation als Suchpfad ergänzen.


NemesisoD - Mi 16.09.15 10:41

Wenn ich das in die App.config schreibe, kann ich den Pfad dann während der Laufzeit anpassen?

Und falls ja, wie?


Ralf Jansen - Mi 16.09.15 10:55

Die Info zur Laufzeit den Ort ändern ist irrgendwie das relevanteste an der ganzen Geschichte. Wenn du Dynamik brauchst das heißt zur Laufzeit erst den Ort festlegen willst wo die liegt dann kannst du es auch erst zur Laufzeit laden. Ergo bist du bei irgendeinem dynamischen Laden von Assemblies wie etwa Assembly.Load.

Das mit dem GetMethod habe ich dann aber nicht verstanden. Designen des Codes und was zur Laufzeit passiert sind 2 verschiedene Probleme. Da du ja schon von Plugin schreibst (und es hoffentlich auch so meinst) wäre es eine gute Idee Interface und Implementierung zu trennen. Heißt du kannst direkt gegen ein Interface programmieren (ohne Klimmzüge) die konkrete Implementierung die zur Laufzeit hinter dem Interface steckt kannst du aber dann belibieg zur Laufzeit von irgendwo laden.


NemesisoD - Mi 23.09.15 15:41

Vielen Dank für die Hilfe....

Ich habe das ganze jetzt über Interfaces gemacht.....

Jetzt habe ich damit aber ein neues Problem....


NemesisoD - Mi 23.09.15 15:52

Ich möchte eine Liste von Objekten erstellen die als Interface deklariert wurde...


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
public interface iPlugin
{
  List<iPlugin2> Liste { get; set; }
}

public interface iPlugin2
{
  string Name { get; set; }
}


In den Klassen Dateien sieht das ganze dann so aus...


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
public class cPlugin : iPlugin
{
  private List<cPlugin2> _plgList = new List<cPlugin2>();

  public List<iPlugin2> PluginList { get {return _plgList;} set {_plgList = value}}
}

public class cPlugin2 : iPlugin2
{
  private string _name;

  public string Name { get {return _name;} set {_name = vale} }
}


Leider bekomme ich folgenden Fehler:
Zitat:
Fehler CS0029 Der Typ "System.Collections.Generic.List<cPlugin2>" kann nicht implizit in "System.Collections.Generic.List<iPlugin2>" konvertiert werden.


Th69 - Mi 23.09.15 16:13

Hallo,

ändere die Zeile einfach zu

C#-Quelltext
1:
private List<iPlugin2> _plgList = new List<iPlugin2>();                    

programmtechnisch kannst du dann konkrete Objekte vom Typ cPlugin2 (oder jedes andere Objekt einer von iPlugin2 abgeleiteten Klasse) hinzufügen.

s. ideone - Code [http://ideone.com/EYZjd0]

PS: Interfaces und Klassen sollten mit einem Großbuchstaben beginnen: IPlugin


NemesisoD - Mi 23.09.15 16:23

Damn....

Manchmal sieht man den Wald vor lauter Bäumen nicht mehr....

Besten dank, es funktioniert....