Exigences : La logique métier est complexe et nécessite une personnalisation, et pour cette logique, dans un assembleur DLL séparé, l’arrière-plan peut mettre à jour dynamiquement l’assembleur et exécuter la logique la plus récente.
.NET Core ne supporte pas la création et le déchargement dynamique des AppDomains comme le .NET Framework, donc il n’y a jamais eu de bonne façon de hotloader des plugins, mais la bonne nouvelle, c’est que .NET Core supporte l’assembleur collectible depuis la version 3.0, et nous pouvons créer un AssemblyLoadContext récupérable que nous pouvons utiliser pour charger et décharger les assemblages.
Classe AssemblyLoadContext :La connexion hyperlientérée est visible.
Tout d’abord, créez une nouvelle console et trois bibliothèques, à savoir :ConsoleApp6、ClassLibraryStandard、ClassLibrary1、ClassLibrary2, parmi lesquelles les bibliothèques ClassLibrary1 et ClassLibrary2 héritent de l’interface IWorker dans ClassLibraryStandard et implémentent la méthode Run.
Code standard de ClassLibrary :
Code ClassLibrary1 :
Code ClassLibrary2 :
Le code console de ConsoleApp6 est le suivant :
La console ouvre la méthode Run de 3 threads dans le plugin DLL qui s’exécute dynamiquement en permanence, utilise log4net pour enregistrer les résultats de sortie, puis l’exécute dans la consoleRemplacez la DLL par la dernière bibliothèque après 3 secondes。
Après avoir lancé la console pendant 1 seconde ou 5 secondes, la collection de l’instance AssemblyLoadContext actuelle est en sortie, qui correspond à la bibliothèque DLL chargée.
Comme montré ci-dessous :
Vous pouvez voir que le programme n’a aucune sortie anormale, et il n’y a aucune situation où le plugin ne peut pas être trouvé pendant le processus d’exécution. La raison pour laquelle log4net enregistre les résultats d’exécution est que la console est bloquée, et afin de garantir que les 3 threads puissent s’exécuter en continu, log4net est utilisé pour enregistrer les résultats d’exécution, comme montré dans la figure ci-dessous :
2024-06-28 14:24:36,606 INFO 11 Fichier roulant - 1 2024-06-28 14:24:36,606 INFO 10 Fichier roulant - Commencez la désinstallation 2024-06-28 14:24:36,606 INFO 13 Fichier roulant - 1 2024-06-28 14:24:36,606 INFO 13 Fichier roulant - 1 2024-06-28 14:24:36,606 INFO 13 Fichier roulant - 1 2024-06-28 14:24:36,606 INFO 11 Fichier roulant - 1 2024-06-28 14:24:36,606 INFO 11 Fichier roulant - 1 2024-06-28 14:24:36,606 INFO 13 Fichier roulant - 1 2024-06-28 14:24:36,606 INFO 13 Fichier roulant - 1 2024-06-28 14:24:36,606 INFO 13 Fichier roulant - 1 2024-06-28 14:24:36,606 INFO 10 Fichier roulant - AssemblyLoadContext_Unloading 2024-06-28 14:24:36,606 INFO 13 Fichier roulant - 1 2024-06-28 14:24:36,606 INFO 13 Fichier roulant - 1 ... 2024-06-28 14:24:36,607 INFOS 12 Fichier roulant - 1 2024-06-28 14:24:36,607 INFO 13 Fichier roulant - 1 2024-06-28 14:24:36,607 INFOS 12 Fichier roulant - 1 2024-06-28 14:24:36,606 INFO 10 Fichier roulant - Désinstallation terminée 2024-06-28 14:24:36,607 INFOS 12 Fichier roulant - 1 2024-06-28 14:24:36,607 INFOS 12 Fichier roulant - 1 ... 2024-06-28 14:24:36,607 INFOS 12 Fichier roulant - 1 2024-06-28 14:24:36,607 INFO 13 Fichier roulant - 1 2024-06-28 14:24:36,607 INFOS 12 Fichier roulant - 1 2024-06-28 14:24:36,607 INFO 13 Fichier roulant - 1 2024-06-28 14:24:36,607 INFOS 12 Fichier roulant - 1 2024-06-28 14:24:36,606 INFO 11 Fichier roulant - 1 2024-06-28 14:24:36,607 INFOS 13 Fichier roulant - 2 2024-06-28 14:24:36,607 INFO 12 Fichier roulant - 2 Configuration config.xml jointe :
(Fin)
|