Dictionary für Events? DLL zur Laufzeit der Anwendung hinzufügen?

02/11/2008 - 04:01 von Christoph Herrmann | Report spam
Hi,

beim Spielen mit C# sind noch Probleme/Fragen offen geblieben, für die
ich noch keine Lösung finden konnte. Vielleicht habt ihr da noch
Hinweise dafür. :)

1. Ich habe eine Klasse die Events definiert, wenn bei einem Attribut
(Dictionary) ein Wert gesetzt oder entfernt wird. Derzeit bekommen die
hinzugefügten Eventhandler allerdings für jeden Zugriff ein Event.

Da hat sich bei mir die Frage gestellt, ob ich nicht eine Liste bzw. in
dem Falle ein Dictionary von Eventhandlern definieren kann?

Derzeit werden die Evente wie folgt definiert und benutzt:

public event AddHandler AddEvent;
public event RemoveHandler RemoveEvent;

AddEvent += new AddHandler(...);

Folgendes hab ich versucht, allerdings lief es auf einen Fehler hinaus:

public event Dictionary<string, AddHandler> AddEvents;
public event Dictionary<string, RemoveHandler> RemoveEvents;

AddEvent["index"] += new AddHandler(...);

Daher die Frage, geht das irgendwie, dass man eine Liste von Events
erstellen kann?

2. Meine Beispielanwendung soll lediglich aus einem Systemtray Symbol
bestehen und einem Objekt für das Kontextmenü des Systemtry Symbols.
Alles Weitere wollte ich in DLL Dateien auslagern, die im gleichen
Verzeichnis wie die Anwendung liegen sollen.

Das heißt, sobald die Anwendung startet, müsste sie alle DLL Dateien im
Programmverzeichnis laden, von bestimmten Klassen (Klassenname zum
Beispiel immer Plugin, Namespace würde zur Eindeutigkeit dem Dateiname
der DLL entsprechen) eine Methode aufrufen und dabei das Objekt für das
Kontextmenü übergeben.

Geht sowas? Also das Auslesen des Verzeichnisses und das Aufrufen der
DLL Dateien bzw. bestimmten Klassen/Methoden darin? Wie müsste dies
ungefàhr aussehen bzw. habt ihr Links mit Beispielen? (Ich denke ja
sowas wie Plugins werden öters gebraucht).

3. Noch eine kleine Frage, da bei mir Fehler kamen, ich allerdings
nirgends einen Hinweis gelesen habe: Kann es sein, dass der Klassenname
anders lauten muss als der Namespace in welchem die Klasse liegt? Ich
hatte die Klasse Pluginsystem im gleichnamigen Namespace definiert und
bekam bei der Verwendung allerdings den Fehler, weil der Compiler meinte
ich würde mit new Pluginsystem den Namespace meinen, obwohl die Klasse
ebenfalls so heißt und der Namespace mit using bekannt gemacht wurde.

Danke schon mal für die Hilfe. :)

Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/
 

Lesen sie die antworten

#1 Frank Dzaebel
02/11/2008 - 08:53 | Warnen spam
Hallo Christoph,

[...] Da hat sich bei mir die Frage gestellt, ob ich nicht eine Liste bzw.
in dem Falle ein Dictionary von Eventhandlern definieren kann?
[...] Folgendes hab ich versucht, allerdings lief es auf einen Fehler
hinaus: public event Dictionary<string, AddHandler> AddEvents;
public event Dictionary<string, RemoveHandler> RemoveEvents;
AddEvent["index"] += new AddHandler(...);
Daher die Frage, geht das irgendwie, dass man eine Liste von Events
erstellen kann?



ja, vorgesehen ist normal die EventHandlerList.
Sie hat Methoden wie AddHandler und RemoveHandler etc..

[Gewusst wie: Behandeln mehrerer Ereignisse mit Ereigniseigenschaften]
http://msdn.microsoft.com/de-de/lib...3a9ch.aspx





2. Meine Beispielanwendung soll lediglich aus einem Systemtray Symbol
bestehen



[NotifyIcon-Komponente (Windows Forms)]
http://msdn.microsoft.com/de-de/lib...z6s5c.aspx





und einem Objekt für das Kontextmenü des Systemtry Symbols.



[Gewusst wie: Zuordnen eines Kontextmenüs zu einer NotifyIcon-Komponente in
Windows Forms]
http://msdn.microsoft.com/de-de/lib...3t178.aspx





Das heißt, sobald die Anwendung startet, müsste sie alle DLL Dateien
im Programmverzeichnis laden, von bestimmten Klassen (Klassenname zum
Beispiel immer Plugin, Namespace würde zur Eindeutigkeit dem Dateiname
der DLL entsprechen) eine Methode aufrufen und dabei das Objekt für
das Kontextmenü übergeben.
Geht sowas?



ja. Es gibt viele Möglichkeiten. Hier ein paar Ansàtze:

[CodeProject: Plugin Architecture using C#]
http://www.codeproject.com/KB/cs/c_...cture.aspx

[Creating a Plug-In Framework]
http://msdn.microsoft.com/en-us/lib...72962.aspx

[CRM Plugin Registration Tool - Home]
http://code.msdn.microsoft.com/crmplugin

[Add Plugins to Your App 2: Search dynamically for plugins without Config
Files]
http://weblogs.asp.net/rosherove/ar.../8048.aspx

oder ggf. den "System.Addin-Namespace" benutzen:

[CLR Inside Out: Erweiterbarkeit von .NET-Anwendungen]
http://msdn.microsoft.com/de-de/mag...63476.aspx





3. Noch eine kleine Frage, da bei mir Fehler kamen, ich allerdings
nirgends einen Hinweis gelesen habe: Kann es sein, dass der
Klassenname anders lauten muss als der Namespace in welchem die
Klasse liegt? Ich hatte die Klasse Pluginsystem im gleichnamigen
Namespace definiert und bekam bei der Verwendung allerdings den
Fehler, weil der Compiler meinte ich würde mit new Pluginsystem den
Namespace meinen, obwohl die Klasse ebenfalls so heißt und der
Namespace mit using bekannt gemacht wurde.



-> "Verwenden Sie nicht denselben Namen für
einen Namespace und eine Klasse". Aus:

[Richtlinien für die Benennung von Namespaces]
http://msdn.microsoft.com/de-de/lib...33284.aspx


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen