Heim > Backend-Entwicklung > C++ > Wie kann ich eine mit Assembly.LoadFrom() geladene Assembly effizient entladen?

Wie kann ich eine mit Assembly.LoadFrom() geladene Assembly effizient entladen?

Susan Sarandon
Freigeben: 2025-01-02 20:36:39
Original
844 Leute haben es durchsucht

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

Entladen einer mit Assembly.LoadFrom() geladenen Assembly

Um die Zeit zu testen, die GetTypes() nach dem Laden einer DLL benötigt, untersuchen wir den Prozess des Entladens und erneuten Ladens der DLL DLL.

Assembly entladen

Wenn eine Assembly mit geladen wird Assembly.LoadFrom() wird es zur Liste der Assemblys der AppDomain hinzugefügt. Zum Entladen gibt es in Assembly oder AppDomain keine explizite Methode zum Entladen. Sie können jedoch eine neue AppDomain erstellen, um die Assembly zu laden, und dann die AppDomain entladen, um die Ressourcen freizugeben.

Neuladen und Zeitvergleich

Um die DLL neu zu laden, befolgen Sie diese Schritte:

  1. Erstellen Sie eine neue AppDomain mit einem anderen Namen.
  2. Laden Sie die Assembly mit in die neue AppDomain AppDomain.Load().
  3. Ermitteln Sie die Zeit, die GetTypes() für die neu geladene Assembly benötigt.
  4. Entladen Sie die AppDomain, um Ressourcen freizugeben.

Beispiel:

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");
Nach dem Login kopieren

In diesem Beispiel werden zwei AppDomains erstellt und die DLL in jede geladen. Anschließend wird die Zeit gemessen, die GetTypes() für beide Instanzen benötigt. Der Zeitunterschied kann auf den Overhead hinweisen, der durch das Neuladen der DLL entsteht.

Explizite Garbage Collection

assem = null reicht nicht aus, um einer Assembly zugewiesene Ressourcen freizugeben. Ein expliziter Aufruf des Garbage Collectors hilft ebenfalls nicht, da AppDomain-spezifische Ressourcen nicht von ihm verwaltet werden. Die Verwendung einer neuen AppDomain ist der empfohlene Ansatz zum Entladen von Assemblys und zum Freigeben der zugehörigen Ressourcen.

Das obige ist der detaillierte Inhalt vonWie kann ich eine mit Assembly.LoadFrom() geladene Assembly effizient entladen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage