Entwickler-Ecke

Basistechnologien - Event einer zur Laufzeit eingebundenen DLL abfangen


C# - Mi 23.10.13 18:40
Titel: Event einer zur Laufzeit eingebundenen DLL abfangen
Hey Leute,

der Titel sagt eigentlich schon alles aus.
Ich habe eine Anwendung (C#) und eine oder mehrere DLLs (C#). Die DLLs sind alle zugänglich, d.h. ich kann sie anpassen, wenn nötig. Ich wollte nun wissen, wie man in der Anwendung auf ein Event reagieren kann, welches in der DLL ausgelöst wurde. Ich habe etwas über interface gelesen, welches man als EventHandler in beiden Klassen verwenden soll, steige da aber nicht so ganz durch. Hier der Link dazu [http://stackoverflow.com/questions/1783764/wiring-up-events-from-dll-loaded-at-runtime].

Kann mir jemand das Prinzip erklären?


Ralf Jansen - Mi 23.10.13 19:14

Wie hast du denn die Dlls im Moment in deine Anwendung eingebunden. Einfach als Referenz oder werden die dynamisch geladen? Wenn letzteres wie hast du die Typen aus den Dlls den bis jetzt angesprochen?


C# - Mi 23.10.13 19:21

Bis jetzt hab ich es mit Reflection gemacht.

C#-Quelltext
1:
2:
3:
4:
Assembly assembly = Assembly.LoadFile(file);
object o = assembly.CreateInstance(myClass);
MethodInfo method = assembly.GetType().GetMethod("Run");
method.Invoke(o, parameter);


Ralf Jansen - Mi 23.10.13 19:41

OK. Wollte nur sichergehen das die verlinkte Geschichte auch wirklich nötig ist. Auch ohne Events wäre in deiner jetzigen Situation ein Interface ebenfalls schon hilfreich um "Run" nicht per Reflection aufrufen zu müssen.

Das Prinzip ist das es ein Interface gibt (also eine bekannte Oberfläche) das deiner Anwendung bekannt ist und gegen das deine Anwendung programmiert ist und von den relevanten Typen in deinen Plugin/Addins oder wie man die Assemblies die du dynamisch lädst auch immer nennen möchte implementiert wird. Im verlinkten Beitrag würde also ConcreteEventHandler deiner myClass entsprechen. Dadurch das du das Interface hast brauchst du die Instanz nicht mehr als reines object benutzen um dann die Methoden per Invoke aufzurufen sondern du kannst die Rückgabe von assembly.CreateInstance direkt auf das Interface casten und hast direkten Zugriff auf die Methoden. (im Beispiel wird auf IEventHandler gecastet). Du kannst also dann Run direkt aufrufen oder wenn du im Interface ein Event definiert hast diesen direkt verdrahten.

Ein Punkt wird in dem Link etwas vernachlässigt. Du willst ja das Anwendung und Dlls sich nicht direkt kennen. Beide sollen aber das Interface kennen und benutzen. Heißt das Interface solltest du in einer 3.ten Assembly/Projekt definieren. Dann kann Anwendung und deine Dlls diese 3.te Assembly referenzieren und müssen sich weiterhin nicht gegenseitig kennen.


C# - Mi 23.10.13 19:45

Achso. Jetzt hab ichs begriffen. Dass mit dem 3ten Assembly hab ich mir schon gedacht. Hatte ich am Ende sowieso vor.
Vielen Dank.