Stellen Sie sich ein Szenario vor, in dem unser Service-System eine Reihe funktionaler Dienste bereitstellt, weitere neue funktionale Dienste in Zukunft hinzugefügt werden und funktionale Dienste möglicherweise geändert oder entfernt werden müssen. Eine gängige Grundvoraussetzung für ein solches Servicesystem ist, dass der Betrieb des Servicesystems beim Hinzufügen, Entfernen oder Aktualisieren funktionaler Services nicht gestoppt werden darf. Normalerweise können "Hot-Swapping-Plugins" sehr einfach implementiert werden, indem jeder Dienst in eine Plugin-DLL gekapselt wird, aber "Hot Replacement" ("dynamischer Ersatz") von Plugins wird zum Problem. Der Grund ist, dass wenn wir eine Plugin-Dll aus dem Service-System deinstallieren, das Service-System tatsächlich noch die zugrundeliegende Referenz auf die DLL enthält, und wenn man versucht, die DLL zu löschen oder zu überschreiben, gibt Windows eine Meldung wie "Die DLL wird verwendet".
Wie löst man also dieses Problem? Ich denke, es gibt mindestens zwei Möglichkeiten:
(1) AppDomain verwenden. Das Laden von Plugins in einer neuen AppDomain und das anschließende Deinstallieren der AppDomain entlädt die Plugin-DLLs sauber aus dem Service-System. Der Nachteil dieses Ansatzes ist, dass man viele AppDomains verwalten muss (weil es so viele funktionale Dienste gibt), und die Kommunikation über AppDomains erfolgt auf ferngesteuerte Weise, was unserem System viele unnötige Kopfschmerzen bereitet. Wenn du interessiert bist, kannst du auch diese Option ausprobieren, und ich bevorzuge die zweite.
(2) Kopiere die Plugin-Dll im Speicher und lade dann die Dll im Speicher. Auf diese Weise können die DLLs auf der Festplatte nach Belieben überschrieben oder gelöscht werden. Früher haben wir Plugin Dll direkt von der Festplatte geladen, so:
Jetzt müssen wir eine Kurve wenden:
Dies löst das Problem des "dynamischen Austauschs" von Plugins.
|