Требования: Бизнес-логика сложна и требует настройки, и для такой логики, в отдельной DLL-ассембле, фон может динамически обновлять ассемблер и выполнять последнюю логику.
.NET Core не поддерживает динамическое создание и удаление AppDomains, как .NET Framework, поэтому никогда не было хорошего способа горячей загрузки плагинов, но хорошая новость в том, что .NET Core поддерживает Collectible Assembly с версий 3.0, и мы можем создать восстанавливаемый AssemblyLoadContext, который можно использовать для загрузки и разгрузки ассемблеров.
Класс AssemblyLoadContext:Вход по гиперссылке виден.
Сначала создайте новую консоль и три библиотеки, а именно:ConsoleApp6、ClassLibraryStandard、ClassLibrary1、ClassLibrary2, среди которых библиотеки ClassLibrary1 и ClassLibrary2 наследуют интерфейс IWorker в ClassLibraryStandard и реализуют метод Run.
ClassLibraryСтандартный код:
Код ClassLibrary1:
Код ClassLibrary2:
Код консоли ConsoleApp6 следующий:
Консоль открывает метод Run из 3 потоков в плагине 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 INFO 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 INFO 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 INFO 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 INFO 12 RollingFile - 2 Прикрепленная config.xml конфигурации:
(Конец)
|