Imagina un escenario en el que nuestro sistema de servicios proporciona una serie de servicios funcionales, y en el futuro se añadirán más servicios funcionales nuevos, y los servicios funcionales podrían necesitar ser modificados o eliminados. Un requisito básico común para este tipo de sistema de servicios es que el funcionamiento del sistema de servicios no pueda detenerse al añadir, eliminar o actualizar servicios funcionales. Normalmente, los "plugins de intercambio en caliente" pueden implementarse muy fácilmente encapsulando cada servicio en una dll de plugins, pero el "reemplazo en caliente" ("reemplazo dinámico") de plugins se convierte en un problema. La razón es que cuando desinstalamos una DLL de plugin del sistema de servicio, el sistema de servicio en realidad sigue manteniendo la referencia subyacente a la DLL, y si intentas borrar o sobrescribir la DLL, Windows mostrará un mensaje como "la dll está siendo utilizada".
¿Cómo resolver este problema? Creo que hay al menos dos opciones:
(1) Utilizar AppDomain. Cargar plugins en un nuevo AppDomain y luego desinstalar el AppDomain descarga limpiamente las DLLs de plugins del sistema de servicio. La desventaja de este enfoque es que necesitas gestionar muchos AppDomaines (porque tienes tantos servicios funcionales), y la comunicación entre AppDomaines se realiza de forma remota, lo que introduce muchos quebraderos de cabeza innecesarios a nuestro sistema. Si te interesa, también puedes probar esta opción, y yo prefiero usar la segunda.
(2) Copiar la DLL del plugin en memoria y luego cargar la DLL en memoria. De este modo, las DLL del disco duro pueden ser sobrescritos o eliminados a voluntad. Anteriormente cargamos el plugin Dll directamente desde el disco duro, así:
Ahora, tenemos que dar un giro:
Esto resuelve el problema de la "sustitución dinámica" de plugins.
|