Persyaratan: Logika bisnis kompleks dan memerlukan penyesuaian, dan untuk logika tersebut, dalam rakitan DLL terpisah, latar belakang dapat memperbarui rakitan secara dinamis dan menjalankan logika terbaru.
.NET Core tidak mendukung pembuatan dan pembongkaran dinamis AppDomains seperti .NET Framework, jadi tidak pernah ada cara yang baik untuk mem-hotload plugin, tetapi kabar baiknya adalah .NET Core telah mendukung Collectible Assembly sejak 3.0, dan kita dapat membuat AssemblyLoadContext yang dapat direklamasi yang dapat kita gunakan untuk memuat dan membongkar rakitan.
AssemblyLoadContext:Login hyperlink terlihat.
Pertama, buat konsol baru dan tiga pustaka, yaitu:Aplikasi Konsol6、Perpustakaan KelasStandar、Perpustakaan Kelas1、Perpustakaan Kelas2, di antaranya pustaka ClassLibrary1 dan ClassLibrary2 mewarisi antarmuka IWorker di ClassLibraryStandard dan mengimplementasikan metode Run.
Kode ClassLibraryStandard:
Kode ClassLibrary1:
Kode ClassLibrary2:
Kode konsol ConsoleApp6 adalah sebagai berikut:
Konsol membuka metode Run dari 3 utas di plugin DLL yang terus-menerus dijalankan secara dinamis, dan menggunakan log4net untuk merekam hasil output, lalu menjalankannya di konsolGanti DLL dengan library terbaru setelah 3 detik。
Setelah menjalankan konsol selama 1 detik atau 5 detik, kumpulan instans AssemblyLoadContext saat ini dikeluarkan, yang merupakan pustaka DLL yang dimuat.
Seperti yang ditunjukkan di bawah ini:
Anda dapat melihat bahwa program tidak memiliki output yang tidak normal, dan tidak ada situasi di mana plugin tidak dapat ditemukan selama proses eksekusi. Alasan mengapa log4net mencatat hasil eksekusi adalah karena konsol diblokir, dan untuk memastikan bahwa 3 utas dapat dieksekusi terus menerus, log4net digunakan untuk merekam hasil eksekusi, seperti yang ditunjukkan pada gambar di bawah ini:
2024-06-28 14:24:36,606 INFO 11 Bergulir-bergulir-bergulir - 1 2024-06-28 14:24:36,606 INFO 10 RollingFile - Mulai menghapus instalan 2024-06-28 14:24:36,606 INFO 13 Bergulir-bergulir - 1 2024-06-28 14:24:36,606 INFO 13 Bergulir-bergulir - 1 2024-06-28 14:24:36,606 INFO 13 Bergulir-bergulir - 1 2024-06-28 14:24:36,606 INFO 11 Bergulir-bergulir-bergulir - 1 2024-06-28 14:24:36,606 INFO 11 Bergulir-bergulir-bergulir - 1 2024-06-28 14:24:36,606 INFO 13 Bergulir-bergulir - 1 2024-06-28 14:24:36,606 INFO 13 Bergulir-bergulir - 1 2024-06-28 14:24:36,606 INFO 13 Bergulir-bergulir - 1 2024-06-28 14:24:36,606 INFO 10 Bergulir-bergulir - AssemblyLoadContext_Unloading 2024-06-28 14:24:36,606 INFO 13 Bergulir-bergulir - 1 2024-06-28 14:24:36,606 INFO 13 Bergulir-bergulir - 1 ... 2024-06-28 14:24:36,607 INFO 12 Bergulir-bergulirFile - 1 2024-06-28 14:24:36,607 INFO 13 Bergulir-bergulir - 1 2024-06-28 14:24:36,607 INFO 12 Bergulir-bergulirFile - 1 2024-06-28 14:24:36,606 INFO 10 RollingFile - Copot pemasangan selesai 2024-06-28 14:24:36,607 INFO 12 Bergulir-bergulirFile - 1 2024-06-28 14:24:36,607 INFO 12 Bergulir-bergulirFile - 1 ... 2024-06-28 14:24:36,607 INFO 12 Bergulir-bergulirFile - 1 2024-06-28 14:24:36,607 INFO 13 Bergulir-bergulir - 1 2024-06-28 14:24:36,607 INFO 12 Bergulir-bergulirFile - 1 2024-06-28 14:24:36,607 INFO 13 Bergulir-bergulir - 1 2024-06-28 14:24:36,607 INFO 12 Bergulir-bergulirFile - 1 2024-06-28 14:24:36,606 INFO 11 Bergulir-bergulir-bergulir - 1 2024-06-28 14:24:36,607 INFO 13 Bergulir-bergulir - 2 2024-06-28 14:24:36,607 INFO 12 Bergulir-bergulir - 2 Konfigurasi config.xml terlampir:
(Akhir)
|