Imaginez un scénario où notre système de services fournit une série de services fonctionnels, et où de nouveaux services fonctionnels seront ajoutés à l’avenir, et où les services fonctionnels pourraient devoir être modifiés ou supprimés. Une exigence de base courante pour un tel système de service est que le fonctionnement du système de service ne puisse pas être arrêté lors de l’ajout/suppression/mise à jour de services fonctionnels. Normalement, les « plugins à échange à chaud » peuvent être très facilement implémentés en encapsulant chaque service dans un DLL de plugins, mais le « remplacement à chaud » (« remplacement dynamique ») des plugins devient un problème. La raison est que lorsque nous désinstallons un plugin DLL du système de service, celui-ci conserve en fait la référence sous-jacente à la DLL, et si vous essayez de supprimer ou d’écraser la DLL, Windows affichera un message du type « la DLL est utilisée ».
Alors, comment résoudre ce problème ? Je pense qu’il y a au moins deux options :
(1) Utiliser AppDomain. Charger des plugins dans un nouveau AppDomain puis désinstaller l’AppDomain décharge proprement les DLL des plugins du système de service. L’inconvénient de cette approche est qu’il faut gérer de nombreux AppDomaines (car vous disposez de nombreux services fonctionnels), et la communication entre AppDomaines se fait à distance, ce qui introduit beaucoup de maux de route inutiles à notre système. Si ça t’intéresse, tu peux aussi essayer cette option, et je préfère utiliser la seconde.
(2) Copiez le DLL du plugin en mémoire, puis chargez le DLL en mémoire. Ainsi, les DLL du disque dur peuvent être écrasées ou supprimées à volonté. Auparavant, nous chargeions le plugin Dll directement depuis le disque dur, comme ceci :
Maintenant, il faut tourner un cap :
Cela résout le problème du « remplacement dynamique » des plugins.
|