Requisitos: La lógica de negocio es compleja y requiere personalización, y para dicha lógica, en un ensamblador DLL separado, el segundo plano puede actualizar dinámicamente el ensamblador y ejecutar la lógica más reciente.
.NET Core no soporta la creación y descarga dinámica de AppDomains como el .NET Framework, así que nunca ha habido una buena forma de cargar plugins en caliente, pero la buena noticia es que .NET Core soporta ensamblador coleccionable desde la versión 3.0, y podemos crear un AssemblyLoadContext recuperable que podamos usar para cargar y descargar ensamblajes.
Clase AssemblyLoadContext:El inicio de sesión del hipervínculo es visible.
Primero, crea una nueva consola y tres librerías, a saber:ConsoleApp6、ClassLibraryStandard、BibliotecaClase1、BibliotecaClase2, entre las cuales las bibliotecas ClassLibrary1 y ClassLibrary2 heredan la interfaz IWorker en ClassLibraryStandard e implementan el método Run.
Código estándar de ClassLibrary:
Código de ClassLibrary1:
Código de ClaseBiblioteca2:
El código de consola de ConsoleApp6 es el siguiente:
La consola abre el método Run de 3 hilos en el plugin DLL que se ejecuta dinámicamente constantemente, usa log4net para registrar los resultados de salida y luego lo ejecuta en la consolaSustituye la DLL por la última librería después de 3 segundos。
Tras ejecutar la consola durante 1 o 5 segundos, se obtiene la colección de la instancia actual de AssemblyLoadContext, que es la biblioteca DLL cargada.
Como se muestra a continuación:
Puedes ver que el programa no tiene ninguna salida anormal y no hay ninguna situación en la que no se pueda encontrar el plugin durante el proceso de ejecución. La razón por la que log4net registra los resultados de la ejecución es porque la consola está bloqueada, y para asegurar que los 3 hilos puedan ejecutarse de forma continua, log4net se utiliza para registrar los resultados de la ejecución, como se muestra en la figura siguiente:
2024-06-28 14:24:36,606 INFO 11 Archivo móvil - 1 2024-06-28 14:24:36,606 INFO 10 Archivo en movimiento - Empieza a desinstalar 2024-06-28 14:24:36,606 INFO 13 Archivo móvil - 1 2024-06-28 14:24:36,606 INFO 13 Archivo móvil - 1 2024-06-28 14:24:36,606 INFO 13 Archivo móvil - 1 2024-06-28 14:24:36,606 INFO 11 Archivo móvil - 1 2024-06-28 14:24:36,606 INFO 11 Archivo móvil - 1 2024-06-28 14:24:36,606 INFO 13 Archivo móvil - 1 2024-06-28 14:24:36,606 INFO 13 Archivo móvil - 1 2024-06-28 14:24:36,606 INFO 13 Archivo móvil - 1 2024-06-28 14:24:36,606 INFO 10 Archivo móvil - AssemblyLoadContext_Unloading 2024-06-28 14:24:36,606 INFO 13 Archivo móvil - 1 2024-06-28 14:24:36,606 INFO 13 Archivo móvil - 1 ... 2024-06-28 14:24:36,607 INFO 12 Archivo móvil - 1 2024-06-28 14:24:36,607 INFO 13 Archivo móvil - 1 2024-06-28 14:24:36,607 INFO 12 Archivo móvil - 1 2024-06-28 14:24:36,606 INFO 10 Archivo Móvil - Desinstalación completada 2024-06-28 14:24:36,607 INFO 12 Archivo móvil - 1 2024-06-28 14:24:36,607 INFO 12 Archivo móvil - 1 ... 2024-06-28 14:24:36,607 INFO 12 Archivo móvil - 1 2024-06-28 14:24:36,607 INFO 13 Archivo móvil - 1 2024-06-28 14:24:36,607 INFO 12 Archivo móvil - 1 2024-06-28 14:24:36,607 INFO 13 Archivo móvil - 1 2024-06-28 14:24:36,607 INFO 12 Archivo móvil - 1 2024-06-28 14:24:36,606 INFO 11 Archivo móvil - 1 2024-06-28 14:24:36,607 INFO 13 Archivo móvil - 2 2024-06-28 14:24:36,607 INFO 12 Archivo móvil - 2 Configuración config.xml adjunta:
(Fin)
|