Hei Leute Ich habe ein Problem mit meinem C#-Projekt. Ich habe ein Grundprojekt welches eigentlich nur aus einer Form besteht. Während der Laufzeit werden dll-Dateien geladen die dann die Menüs etc. bilden. Dies geschieht aufgrund der Tatsache dass das Tool in so vielen Versionen existieren muss. Jetzt steh' ich vor einem Problem. Ich habe in meiner Exe eine Klasse die ich in der DLL auch benötige. Die Klasse ist mit dem Singletonpattern umgesetzt und ich benötige in beiden die gleiche Instanz davon. Wie kann ich nun also implementieren, dass ich von der dll und der exe auf diese Klasse zugreifen muss? (Wenn möglich ohne dass ich eine dritte dll bauen muss) Viel Danke und viel Gruss.. ;-) Farin
Ohne den Kontext jetzt genau zu kennen würde ich das so machen: - baue eine dritte DLL (ohne geht's nicht!). - in dieser legst du ein Interface für deine Singleton-Klasse an - Diese DLL wird von der EXE und deinem Plugin referenziert. - In der exe gibt es zusätzlich eine Klasse, die das Interface implementiert. - Zur Laufzeit wird in der exe ein Objekt von dieser Klasse instanziiert. - Das übergibst du dann der DLL, sobald sie geladen wurde. Und schon sind alle glücklich ;-)
Das kommt jetzt ganz drauf an welche Architektur du sonst hast und wie die Abhängigkeiten sind Da du ja schon die Abhängigkeit in Richtung der DLL hast, könnte die DLL Funktionen zur Erzeugung und Verwaltung des Objekts zur Verfügung stellen die dann natürlich auch von der dll selbst genutzt werden können. Es ginge also schon ohne dritte dll, vorausgesetzt die Architektur ist einigermaßen in Ordnung Wenn das die EXE machen würde hättest du eine zyklische Abhängigkeit. Wenn das Objekt Daten zur Verfügung stellt, die dann auch gespeichert werden wäre eine separate dll die das verwaltet definitiv anzuraten.
Sebastian L. schrieb: > Es ginge also schon ohne dritte dll Sicher? Zur Kompilezeit kennt die exe die DLL ja noch garnicht, wie soll sie dann mit einer Klasse aus der DLL arbeiten?
Hi Sharping Wenn ich nach deiner Lösung vorgehe und eine dritte Dll schreibe wäre es doch sowieso einfacher die Klassen in die neue DLL zu kopieren und einfach eine Referenz draufzusetzen aus der exe und der dll. So Spare ich mir das Interfacegebastel. Gibts es deiner Meinung echt keine Möglichkeit das System zu vereinfachen oder bin ich zu blöd den Wald vor lauter Bäumen zu sehen? ^^
Du kannst natürlich auch auf die Interfaces verzichten. Würde ich allerdings nicht tun ;-) Es ist ja durchaus absehbar, dass du die Implemntierung der Singleton-Klasse verändern willst (bugs fixen o.Ä. In deinem fall müsttest du dann die 3. DLL neu kompilieren, die Plugin-DLL neu Kompilieren und die .exe neu kompilieren. Wenn du in der 3. DLL und dem Plugin aber nur ein Interface verwendest, brauchst du die nie wieder anzufassen. Dann kannst du in der .exe an der Klasse rumbasteln bis der Arzt kommt.
Das geht ganz gut mit refelction ist aber dann nicht typsicher das ist ganz klar Was noch möglich ist. Wenn die exe keine abhängigkeit zur dll hat, könnte man in der exe das interface deklarieren und dann die dll davon abhängig machen. Ich frage mich nur: Wenn die Exe mehr oder weniger nur eine form ist und die dll die logik liefert, warum die exe das objekt kennen muss. Also so lange deine Architektur nicht bekannt ist, ist die intelligenteste und einfachste Lösung die zusätzliche dll.
Also für den Aufbau. Die Klasse ist eine Ressourcen-Klasse sie speichert gewisse Instanzen von Objekten und gibt diese zurück. Diese aufgrund der Tatsache dass die Objekte nicht mit dem Singleton-Pattern übergeben werden können. Die Form hat gewisse Grundfunktionalitäten welche die Dll zur Laufzeit erweitert je nach Version die man hat stehen andere Funktionen zur Verfügung welche die Grundfunktionalitäten erweitern. Ich hoffe das war in irgendeiner Weise verständlich ^^
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.