Wymagania: Logika biznesowa jest złożona i wymaga dostosowywania się, a dla takiej logiki, w osobnym asemblerze DLL, tło może dynamicznie aktualizować asembl i wykonywać najnowszą logikę.
.NET Core nie obsługuje dynamicznego tworzenia i usuwania AppDomainów tak jak .NET Framework, więc nigdy nie było dobrego sposobu na hotload wtyczek, ale dobrą wiadomością jest to, że .NET Core obsługuje Collectible Assembly od wersji 3.0 i możemy stworzyć odzyskiwalny AssemblyLoadContext, którego możemy używać do ładowania i wyładowywania asembleriów.
Klasa AssemblyLoadContext:Logowanie do linku jest widoczne.
Po pierwsze, stwórz nową konsolę i trzy biblioteki, mianowicie:ConsoleApp6、ClassLibraryStandard、ClassLibrary1、ClassLibrary2, wśród których biblioteki ClassLibrary1 i ClassLibrary2 dziedziczą interfejs IWorker w ClassLibraryStandard i implementują metodę Run.
Kod ClassLibraryStandard:
Kod ClassLibrary1:
Kod ClassLibrary2:
Kod konsoli ConsoleApp6 wygląda następująco:
Konsola otwiera metodę Run z 3 wątkami w wtyczce DLL, która jest ciągle dynamicznie wykonywana, używa log4net do zapisywania wyników wyjściowych, a następnie uruchamia ją w konsoliZamień DLL na najnowszą bibliotekę po 3 sekundach。
Po uruchomieniu konsoli przez 1 lub 5 sekund wychodzi kolekcja aktualnej instancji AssemblyLoadContext, czyli załadowana biblioteka DLL.
Jak pokazano poniżej:
Widać, że program nie ma żadnych nieprawidłowych wyników i nie ma sytuacji, w której wtyczka nie może być dostępna podczas wykonywania. Powodem, dla którego log4net rejestruje wyniki wykonania, jest to, że konsola jest zablokowana, a aby zapewnić, że 3 wątki mogą działać nieprzerwanie, log4net służy do zapisywania wyników wykonywania, jak pokazano na poniższym rysunku:
2024-06-28 14:24:36,606 INFO 11 RollingFile - 1 2024-06-28 14:24:36,606 INFO 10 RollingFile - Rozpocznij odinstalowywanie 2024-06-28 14:24:36,606 INFO 13 RollingFile - 1 2024-06-28 14:24:36,606 INFO 13 RollingFile - 1 2024-06-28 14:24:36,606 INFO 13 RollingFile - 1 2024-06-28 14:24:36,606 INFO 11 RollingFile - 1 2024-06-28 14:24:36,606 INFO 11 RollingFile - 1 2024-06-28 14:24:36,606 INFO 13 RollingFile - 1 2024-06-28 14:24:36,606 INFO 13 RollingFile - 1 2024-06-28 14:24:36,606 INFO 13 RollingFile - 1 2024-06-28 14:24:36,606 INFO 10 RollingFile - AssemblyLoadContext_Unloading 2024-06-28 14:24:36,606 INFO 13 RollingFile - 1 2024-06-28 14:24:36,606 INFO 13 RollingFile - 1 ... 2024-06-28 14:24:36,607 INFO 12 RollingFile - 1 2024-06-28 14:24:36,607 INFO 13 RollingFile - 1 2024-06-28 14:24:36,607 INFO 12 RollingFile - 1 2024-06-28 14:24:36,606 INFO 10 RollingFile - Odinstalowanie zakończone 2024-06-28 14:24:36,607 INFO 12 RollingFile - 1 2024-06-28 14:24:36,607 INFO 12 RollingFile - 1 ... 2024-06-28 14:24:36,607 INFO 12 RollingFile - 1 2024-06-28 14:24:36,607 INFO 13 RollingFile - 1 2024-06-28 14:24:36,607 INFO 12 RollingFile - 1 2024-06-28 14:24:36,607 INFO 13 RollingFile - 1 2024-06-28 14:24:36,607 INFO 12 RollingFile - 1 2024-06-28 14:24:36,606 INFO 11 RollingFile - 1 2024-06-28 14:24:36,607 INFO 13 RollingFile - 2 2024-06-28 14:24:36,607 INFO 12 RollingFile - 2 Dołączone config.xml konfiguracja:
(Koniec)
|