Вимоги: Бізнес-логіка є складною і потребує налаштування, і для такої логіки в окремій DLL-асамблеї фон може динамічно оновлювати асемблер і виконувати останню логіку.
.NET Core не підтримує динамічне створення та видалення AppDomains, як .NET Framework, тому ніколи не було хорошого способу hotload плагінів, але хороша новина в тому, що .NET Core підтримує Collectible Assembly з версії 3.0, і ми можемо створити відновлюваний AssemblyLoadContext, який можна використовувати для завантаження та розвантаження асемблерів.
Клас AssemblyLoadContext:Вхід за гіперпосиланням видно.
Спочатку створити нову консоль і три бібліотеки, а саме:ConsoleApp6、ClassLibraryStandard、ClassLibrary1、ClassLibrary2, серед яких бібліотеки ClassLibrary1 та ClassLibrary2 успадковують інтерфейс IWorker у ClassLibraryStandard і реалізують метод Run.
ClassLibraryСтандартний код:
Код ClassLibrary1:
Код ClassLibrary2:
Код консолі ConsoleApp6 виглядає так:
Консоль відкриває метод Run із трьох потоків у плагіні DLL, який постійно динамічно виконується, і використовує log4net для запису результатів, після чого запускає його в консоліЗамініть DLL на найновішу бібліотеку через 3 секунди。
Після запуску консолі протягом 1 або 5 секунд виводиться колекція поточного екземпляра AssemblyLoadContext — це завантажена бібліотека DLL.
Як показано нижче:
Ви бачите, що програма не має аномального виходу, і немає ситуації, коли плагін не можна знайти під час виконання. Причина, чому log4net записує результати виконання, полягає в тому, що консоль заблокована, і щоб забезпечити безперервне виконання трьох потоків, log4net використовується для запису результатів виконання, як показано на рисунку нижче:
2024-06-28 14:24:36,606 ІНФО 11 RollingFile - 1 2024-06-28 14:24:36,606 ІНФО 10 RollingFile - Почати видалення 2024-06-28 14:24:36,606 ІНФО 13 RollingFile - 1 2024-06-28 14:24:36,606 ІНФО 13 RollingFile - 1 2024-06-28 14:24:36,606 ІНФО 13 RollingFile - 1 2024-06-28 14:24:36,606 ІНФО 11 RollingFile - 1 2024-06-28 14:24:36,606 ІНФО 11 RollingFile - 1 2024-06-28 14:24:36,606 ІНФО 13 RollingFile - 1 2024-06-28 14:24:36,606 ІНФО 13 RollingFile - 1 2024-06-28 14:24:36,606 ІНФО 13 RollingFile - 1 2024-06-28 14:24:36,606 ІНФО 10 RollingFile - AssemblyLoadContext_Unloading 2024-06-28 14:24:36,606 ІНФО 13 RollingFile - 1 2024-06-28 14:24:36,606 ІНФО 13 RollingFile - 1 ... 2024-06-28 14:24:36,607 ІНФО 12 RollingFile - 1 2024-06-28 14:24:36,607 ІНФО 13 RollingFile - 1 2024-06-28 14:24:36,607 ІНФО 12 RollingFile - 1 2024-06-28 14:24:36,606 ІНФО 10 RollingFile - Видалення завершено 2024-06-28 14:24:36,607 ІНФО 12 RollingFile - 1 2024-06-28 14:24:36,607 ІНФО 12 RollingFile - 1 ... 2024-06-28 14:24:36,607 ІНФО 12 RollingFile - 1 2024-06-28 14:24:36,607 ІНФО 13 RollingFile - 1 2024-06-28 14:24:36,607 ІНФО 12 RollingFile - 1 2024-06-28 14:24:36,607 ІНФО 13 RollingFile - 1 2024-06-28 14:24:36,607 ІНФО 12 RollingFile - 1 2024-06-28 14:24:36,606 ІНФО 11 RollingFile - 1 2024-06-28 14:24:36,607 ІНФО 13 RollingFile - 2 2024-06-28 14:24:36,607 ІНФО 12 RollingFile - 2 Прикріплені config.xml конфігурації:
(Кінець)
|