garbage collector c# como funciona
Descargando el conjunto cargado con Assembly.LoadFrom() (4)
Necesito comprobar la cantidad de tiempo para ejecutar GetTypes () después de cargar el dll. El código es el siguiente.
Assembly assem = Assembly.LoadFrom(file);
sw = Stopwatch.StartNew();
var types1 = assem.GetTypes();
sw.Stop();
double time1 = sw.Elapsed.TotalMilliseconds;
Me gustaría descargar y volver a cargar el dll para verificar el tiempo de inversión en ejecutar GetTypes () nuevamente.
- ¿Cómo puedo descargarlo?
assem = null
es lo suficientemente bueno? - ¿Hay alguna forma explícita de llamar al recolector de basura para reclamar el recurso asignado a assem?
¿Puedes usar otro 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);
En lugar de usar LoadFrom()
o LoadFile()
puede usar Load
with File.ReadAllBytes()
. Con esto no usa el archivo de ensamblaje, pero lo leerá y usará datos de lectura.
Tu código se verá así
Assembly assem = Assembly.Load(File.ReadAllBytes(filePath));
sw = Stopwatch.StartNew();
var types1 = assem.GetTypes();
sw.Stop();
double time1 = sw.Elapsed.TotalMilliseconds;
Desde here , no podemos descargar el archivo a menos que se descarguen todos los dominios que contiene.
Espero que esto ayude.:)
Lamentablemente, no puede descargar un conjunto una vez que está cargado. Pero puedes descargar un AppDomain. Lo que puede hacer es crear un nuevo dominio de aplicación (dominio de aplicación.dominio de creación (...)), cargar el conjunto en este dominio de aplicación para trabajar con él y luego descargar el dominio de aplicación cuando sea necesario. Al descargar AppDomain, se descargarán todos los ensamblados que se hayan cargado. (Ver reference )
Para llamar al recolector de basura, puede usar
GC.Collect(); // collects all unused memory
GC.WaitForPendingFinalizers(); // wait until GC has finished its work
GC.Collect();
GC llama a los finalizadores en un hilo de fondo, es por eso que tiene que esperar y llamar a Collect () nuevamente para asegurarse de que eliminó todo.
No puede descargar el ensamblado del dominio de aplicación actual. Pero puede crear un nuevo AppDomain, cargar ensamblajes en él, ejecutar algún código dentro de un nuevo AppDomain y luego descargarlo. Consulte el siguiente enlace: MSDN