Hi,
wir haben eine modulare Anwendung, die ähnlich einer Plugin-Architektur aufgebaut ist: Modul-DLLs werden aus einem Verzeichnis dynamisch geladen. Es gibt bestimmte Utility/Common-DLLs, die von den Modul-DLLs geteilt werden.
Jetzt ist das Problem, dass wir eine Modul-DLL nur mit getesten Komponenten ausliefern möchten, also z.B. ModulA.dll, v1.0.0.0 mit Utils.dll, v1.1.0.0. Alle Assemblies haben deshalb einen Strong Keyname.
Was ist aber, wenn noch eine ModulB.dll, v2.0.0.0 mit Utils.dll, v2.0.0.0 dazukommt? Ist es irgendwie möglich, dass Utils.dll in v1.1.0.0 für ModulA.dll in den Prozess geladen wird, und gleichzeitig für ModulB.dll in v2.0.0.0?
Falls ja, müsste die Utils.dll im GAC sein, oder? Besser wäre für uns aber, wenn wir sie umbenennen könnten als Utils1_1_0_0.dll und Utils2_0_0_0.dll. Ist das möglich? Wenn nicht, wie sieht es aus, wenn wir die Assemblies mit NMerge zusammenmergen, also ModulA.dll mit v1.1.0.0 und ModulB mit v2.0.0.0 von Utils.dll?
Ich glaube, dass es mit verschiedenen AppDomains funktionieren müsste. Bisher setzen wir aber keine AppDomains ein (ist nicht notwendig, da die Module nicht entladen werden müssen) und ein Umstieg wäre sehr aufwendig. Deshalb stelle ich die Frage speziell unter der Bedingung, dass es ohne separate AppDomains gehen muss.
Ich bin gespannt auf eure Antworten.
Danke und Gruß,
Steven
Kannst du nicht eine Ordnerstruktur aufbauen die sich dem Versionsschema anpasst? Wär zwar simple aber leicht umzusetzen g
Gruß David
Klar, kann ich machen. Die Frage ist aber, ob eine DLL mehrfach (mit unterschiedlichen Versionen) in den selben Prozess geladen werden kann.
Du lädst es doch dynamisch zur Laufzeit, oder? Da sollte das doch nicht das Problem sein...
Gruß David
ok, du meinst es funktioniert? Dann schreibe ich später mal eine Testanwendung
In der gleichen AppDomain ist es nur möglich einmalig die DLL zu laden, ich bin mir aber ngrad nicht sicher, ob es möglich ist, die gleiche Dll mit unterschiedlichen Versionen zu laden, aber ich meine das funktioniert nicht.
Wenn du eine Abschottung zwischen Hauptprogramm und Addins haben möchtest, nutze AppDomains (für jedes AddIn eine eigene), da bist auf der sicheren Seite.
Ohne sep. AppDomain wirst du keine Chance haben.
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...
huhu,
ich sehe keine Chance diese Plugins in der selben AppDomain doppelt zu laden, denn dann hast Du ja Typen doppelt. Imho kommt beim laden schon ein Fehler.
🙂
Xynratron
Herr, schmeiss Hirn vom Himmel - Autsch!
Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.
Ich habe mal sowas ähnliches probiert, da wurde allerdings die DLL zur laufzeit verändert und neu Kompiliert und dann wieder geladen. Wenn du DLL schon vorhanden ist wird sie nicht neu geladen. .Net erkennt, dass sie bereits vorhanden ist und geht deshalb davon aus, dass sie nicht noch einmal geladen werden muss. Allerdings weiss ich nicht, wie es mit verschiedenen Versionen aussieht, denke aber, dass maximal die alte durch die neue ersetzt wird. Ich denke du wirst an AppDomains nicht vorbeikommen.
Danke für eure Antworten!
Ich habe es mir fast so gedacht - da bleibt wohl eine Migration auf AppDomains als einzige Möglichkeit 😕
Hallo steven11,
verzeih mir bitte, wenn ich auch meinen Senf dazugebe:
Wenn du mit AppDomains arbeitest, musst du ein wenig aufpassen. Sobald du über AppDomain-Grenzen hinweg Daten und Objekte transferieren willst, müssen diese serialisiert werden. Dazu müssen sie mit Serializable() gekennzeichnet sein.
Die meisten grafischen Controls (z. B. Windows.Forms, Buttons, Labels, Listview, etc etc) sind NICHT als serialisierbar gekennzeichnet.
Willst du z. B. eine Form in eine DLL ausgliedern und diese Form als Child einer anderen Form anzeigen die nicht in der selben AppDomain ist, funktioniert das nicht. Das schränkt die Verwendung von AppDomains in Plugin-Architekturen meiner Meinung nach sehr ein. Leider lässt sich das nicht ändern. Ich wollte nur, das du das vorher weißt, bevor du viel Arbeit investierst. Ich hab den Fehler schonmal gemacht...
mfg
Easy