Anforderungen: Die Geschäftslogik ist komplex und erfordert Anpassung, und für diese Logik kann der Hintergrund in einer separaten DLL-Assembler die Assembly dynamisch aktualisieren und die neueste Logik ausführen.
.NET Core unterstützt keine dynamische Erstellung und Entladung von AppDomains wie das .NET Framework, daher gab es nie eine gute Möglichkeit, Plugins zu hotloaden, aber die gute Nachricht ist, dass .NET Core Collectible Assembly seit 3.0 unterstützt und wir einen wiederherstellbaren AssemblyLoadContext erstellen können, mit dem wir Assemblies laden und entladen können.
AssemblyLoadContext-Klasse:Der Hyperlink-Login ist sichtbar.
Erstens eine neue Konsole und drei Bibliotheken erstellen, nämlich:ConsoleApp6、ClassLibraryStandard、ClassLibrary1、ClassLibrary2, unter denen die ClassLibrary1- und ClassLibrary2-Bibliotheken die IWorker-Schnittstelle in ClassLibraryStandard übernehmen und die Run-Methode implementieren.
ClassLibraryStandard-Code:
ClassLibrary1-Code:
ClassLibrary2-Code:
Der Konsolencode von ConsoleApp6 lautet wie folgt:
Die Konsole öffnet die Run-Methode mit 3 Threads im DLL-Plugin, das ständig dynamisch ausgeführt wird, nutzt log4net, um die Ausgabeergebnisse aufzuzeichnen und sie dann in der Konsole auszuführenErsetze die DLL nach 3 Sekunden durch die neueste Bibliothek。
Nachdem die Konsole 1 oder 5 Sekunden ausgeführt wurde, wird die Sammlung der aktuellen AssemblyLoadContext-Instanz ausgegeben, die die geladene DLL-Bibliothek darstellt.
Wie unten gezeigt:
Man sieht, dass das Programm keine abnormalen Ausgaben hat und es keine Situation gibt, in der das Plugin während des Ausführungsprozesses nicht gefunden werden kann. Der Grund, warum log4net die Ausführungsergebnisse aufzeichnet, liegt darin, dass die Konsole blockiert ist, und um sicherzustellen, dass die drei Threads kontinuierlich ausgeführt werden können, wird log4net verwendet, um die Ausführungsergebnisse aufzuzeichnen, wie in der untenstehenden Abbildung dargestellt:
2024-06-28 14:24:36,606 INFO 11 RollingFile - 1 2024-06-28 14:24:36,606 INFO 10 RollingFile – Deinstallation beginnen 2024-06-28 14:24:36,606 INFO 13 RollingFile - 1 2024-06-28 14:24:36,606 INFO 13 RollingFile - 1 2024-06-28 14:24:36,606 INFO 13 RollingFile - 1 2024-06-28 14:24:36,606 INFO 11 RollingFile - 1 2024-06-28 14:24:36,606 INFO 11 RollingFile - 1 2024-06-28 14:24:36,606 INFO 13 RollingFile - 1 2024-06-28 14:24:36,606 INFO 13 RollingFile - 1 2024-06-28 14:24:36,606 INFO 13 RollingFile - 1 2024-06-28 14:24:36,606 INFO 10 RollingFile - AssemblyLoadContext_Unloading 2024-06-28 14:24:36,606 INFO 13 RollingFile - 1 2024-06-28 14:24:36,606 INFO 13 RollingFile - 1 ... 2024-06-28 14:24:36,607 INFO 12 RollingFile - 1 2024-06-28 14:24:36,607 INFO 13 RollingFile - 1 2024-06-28 14:24:36,607 INFO 12 RollingFile - 1 2024-06-28 14:24:36,606 INFO 10 RollingFile - Deinstallation abgeschlossen 2024-06-28 14:24:36,607 INFO 12 RollingFile - 1 2024-06-28 14:24:36,607 INFO 12 RollingFile - 1 ... 2024-06-28 14:24:36,607 INFO 12 RollingFile - 1 2024-06-28 14:24:36,607 INFO 13 RollingFile - 1 2024-06-28 14:24:36,607 INFO 12 RollingFile - 1 2024-06-28 14:24:36,607 INFO 13 RollingFile - 1 2024-06-28 14:24:36,607 INFO 12 RollingFile - 1 2024-06-28 14:24:36,606 INFO 11 RollingFile - 1 2024-06-28 14:24:36,607 INFO 13 RollingFile - 2 2024-06-28 14:24:36,607 INFO 12 RollingFile - 2 Angehängt config.xml Konfiguration:
(Ende)
|