Laden...

DLL mehrfach innerhalb eines Prozesses laden?

Erstellt von steven11 vor 15 Jahren Letzter Beitrag vor 15 Jahren 2.709 Views
S
steven11 Themenstarter:in
146 Beiträge seit 2007
vor 15 Jahren
DLL mehrfach innerhalb eines Prozesses laden?

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

998 Beiträge seit 2007
vor 15 Jahren

Kannst du nicht eine Ordnerstruktur aufbauen die sich dem Versionsschema anpasst? Wär zwar simple aber leicht umzusetzen g

Gruß David

S
steven11 Themenstarter:in
146 Beiträge seit 2007
vor 15 Jahren

Klar, kann ich machen. Die Frage ist aber, ob eine DLL mehrfach (mit unterschiedlichen Versionen) in den selben Prozess geladen werden kann.

998 Beiträge seit 2007
vor 15 Jahren

Du lädst es doch dynamisch zur Laufzeit, oder? Da sollte das doch nicht das Problem sein...

Gruß David

S
steven11 Themenstarter:in
146 Beiträge seit 2007
vor 15 Jahren

ok, du meinst es funktioniert? Dann schreibe ich später mal eine Testanwendung

3.971 Beiträge seit 2006
vor 15 Jahren

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...

X
1.177 Beiträge seit 2006
vor 15 Jahren

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.

C
401 Beiträge seit 2007
vor 15 Jahren

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.

S
steven11 Themenstarter:in
146 Beiträge seit 2007
vor 15 Jahren

Danke für eure Antworten!

Ich habe es mir fast so gedacht - da bleibt wohl eine Migration auf AppDomains als einzige Möglichkeit 😕

E
200 Beiträge seit 2006
vor 15 Jahren

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