Scaricare l’assembly caricato con Assembly.LoadFrom ()

Devo controllare l’ammontare del tempo per eseguire GetTypes () dopo aver caricato la DLL. Il codice è il seguente.

Assembly assem = Assembly.LoadFrom(file); sw = Stopwatch.StartNew(); var types1 = assem.GetTypes(); sw.Stop(); double time1 = sw.Elapsed.TotalMilliseconds; 

Vorrei scaricare e ricaricare la DLL per verificare di nuovo il tempo da dedicare all’esecuzione di GetTypes ().

  • Come posso scaricarlo? assem = null è abbastanza buono?
  • Esiste un modo esplicito per chiamare Garbage Collector per recuperare la risorsa allocata all’assem?

Sfortunatamente non è ansible scaricare un assieme una volta caricato. Ma puoi scaricare un AppDomain. Quello che puoi fare è creare un nuovo AppDomain (AppDomain.CreateDomain (…)), caricare l’assembly in questo appdomain per utilizzarlo e quindi scaricare AppDomain quando necessario. Quando si scarica AppDomain, tutti gli assembly che sono stati caricati verranno scaricati. (Vedi riferimento )

Per chiamare il garbage collector, puoi usare

 GC.Collect(); // collects all unused memory GC.WaitForPendingFinalizers(); // wait until GC has finished its work GC.Collect(); 

GC chiama i finalizzatori in un thread in background, ecco perché devi aspettare e chiamare Collect () di nuovo per essere sicuro di aver cancellato tutto.

Puoi usare un altro AppDomain?

 AppDomain dom = AppDomain.CreateDomain("some"); AssemblyName assemblyName = new AssemblyName(); assemblyName.CodeBase = pathToAssembly; Assembly assembly = dom.Load(assemblyName); Type [] types = assembly.GetTypes(); AppDomain.Unload(dom); 

Invece di usare LoadFrom() o LoadFile() puoi usare Load with File.ReadAllBytes() . Con questo non usa il file assembly ma lo leggerà e userà i dati letti.

Il tuo codice sarà quindi simile

 Assembly assem = Assembly.Load(File.ReadAllBytes(filePath)); sw = Stopwatch.StartNew(); var types1 = assem.GetTypes(); sw.Stop(); double time1 = sw.Elapsed.TotalMilliseconds; 

Da qui non è ansible scaricare il file a meno che tutti i domini in esso contenuti non vengano scaricati.

Spero che questo ti aiuti.:)

Non è ansible scaricare assembly dall’AppDomain corrente. Ma puoi creare un nuovo AppDomain, caricare gli assembly in esso, eseguire del codice all’interno del nuovo AppDomain e quindi scaricarlo. Controllare il seguente link: MSDN