Autor Beitrag
NemesisoD
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: Mi 16.09.15 10:15 
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

_________________
Wer nicht programmiert, der lebt nicht!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: 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?

_________________
Wer nicht programmiert, der lebt nicht!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: 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....

_________________
Wer nicht programmiert, der lebt nicht!
NemesisoD Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: Mi 23.09.15 15:52 
Ich möchte eine Liste von Objekten erstellen die als Interface deklariert wurde...

ausblenden 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...

ausblenden 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.

_________________
Wer nicht programmiert, der lebt nicht!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 23.09.15 16:13 
Hallo,

ändere die Zeile einfach zu
ausblenden 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

PS: Interfaces und Klassen sollten mit einem Großbuchstaben beginnen: IPlugin
NemesisoD Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: Mi 23.09.15 16:23 
Damn....

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

Besten dank, es funktioniert....

_________________
Wer nicht programmiert, der lebt nicht!