Autor Beitrag
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Mi 23.10.13 18:40 
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.

Kann mir jemand das Prinzip erklären?

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Mi 23.10.13 19:21 
Bis jetzt hab ich es mit Reflection gemacht.
ausblenden 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);

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.

Für diesen Beitrag haben gedankt: C#
C# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: 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.

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler