首頁 >後端開發 >C++ >如何有效率地卸載使用Assembly.LoadFrom()載入的組件?

如何有效率地卸載使用Assembly.LoadFrom()載入的組件?

Susan Sarandon
Susan Sarandon原創
2025-01-02 20:36:39821瀏覽

How Can I Efficiently Unload an Assembly Loaded with Assembly.LoadFrom()?

卸載透過Assembly.LoadFrom() 載入的組件

為了測試載入DLL 後GetTypes() 所花費的時間,讓我們來探索一下卸載和重新載入DLL 的過程DLL。

卸載組件

當組件載入時使用 Assembly.LoadFrom() 載入後,它會加入 AppDomain 的組件清單中。要卸載它,Assembly 或 AppDomain 中沒有明確的方法用於卸載。不過,您可以建立新的 AppDomain 來載入組件,然後卸載 AppDomain 以釋放資源。

重新載入和時間比較

要重新載入 DLL,請按照以下步驟操作:

  1. 使用不同的名稱建立新的 AppDomain。
  2. 將組件載入到新的 AppDomain 中使用 AppDomain.Load()。
  3. 取得 GetTypes() 重新載入組件所花費的時間。
  4. 卸載 AppDomain 以釋放資源。

範例:

string file = "path/to/assembly.dll";

// First AppDomain
AppDomain dom1 = AppDomain.CreateDomain("domain1");
Assembly assem1 = dom1.Load(file);
Stopwatch sw1 = Stopwatch.StartNew();
var types1 = assem1.GetTypes();
sw1.Stop();
double time1 = sw1.Elapsed.TotalMilliseconds;
AppDomain.Unload(dom1);

// Second AppDomain
AppDomain dom2 = AppDomain.CreateDomain("domain2");
Assembly assem2 = dom2.Load(file);
Stopwatch sw2 = Stopwatch.StartNew();
var types2 = assem2.GetTypes();
sw2.Stop();
double time2 = sw2.Elapsed.TotalMilliseconds;
AppDomain.Unload(dom2);

Console.WriteLine($"First Load: {time1} milliseconds");
Console.WriteLine($"Second Load: {time2} milliseconds");

此範例建立兩個 AppDomain 並將 DLL 載入到每個應用程式網域中。然後,它測量兩個實例的 GetTypes() 所花費的時間。時間上的差異可以顯示重新載入 DLL 所產生的開銷。

明確垃圾回收

assem = null 不足以釋放分配給程序集的資源。明確呼叫垃圾收集器也無濟於事,因為 AppDomain 特定的資源不由它管理。建議使用新的 AppDomain 來卸載組件並釋放其關聯資源。

以上是如何有效率地卸載使用Assembly.LoadFrom()載入的組件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn