.NET6 之 DLL 熱插拔(AssemblyLoadContext)紀錄

let DLL hot swap. 動態卸載。AssemblyLoadContext。

引言

讓 DLL 檔熱插拔。

若只要動態載入 DLL,用 Assembly.LoadFrom()arrow-up-right 指令即可,不過載入後就歸入 AppDomain 且無法卸載直到程式結束才會卸載。

若要可以動態卸載(熱插拔)就要用 AssemblyLoadContext arrow-up-right類別來載入,且 isCollectible 屬性一定要設成 true。還要搭配 WeakReference 類別arrow-up-right才能真的卸載。還有一些微妙的操作才能有作用。

應用上可用來實作系統的外部插件(plug-in)或 debug 工具程式。

古早以前用 Loadlibrary / FreeLibrary 指令就能搞定了,改成這樣不知是進步還是…

參考文件

進階參考文件(未認證)

關鍵原碼紀錄

依官方標準解,一定要繼承 AssemblyLoadContextarrow-up-right 。記得設定 isCollectible = true,才能動態卸載。

一定要有一個 ExecuteAndUnload 函式且要加掛 [MethodImpl(MethodImplOptions.NoInlining)] 屬性以避免被C# 編輯成 inline 模式讓動態卸載無效。

該 DLL 的任務完成後(或插件程序執行完後)用 WeakReference 類別arrow-up-right註記該 DLL 已『Unload』。 並在最後的最後用 GC.Collect 指令真的釋放它。

triangle-exclamation

(EOF)

Last updated