Descarregando o conjunto carregado com Assembly.LoadFrom ()

Eu preciso verificar a quantidade de tempo para executar GetTypes () depois de carregar a dll. O código é o seguinte.

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

Gostaria de descarregar e recarregar a dll para verificar o tempo gasto na execução de GetTypes () novamente.

  • Como posso descarregar? assem = null é bom o suficiente?
  • Existe uma maneira explícita de chamar o coletor de lixo para recuperar o recurso alocado para assem?

    Infelizmente você não pode descarregar uma assembly depois de carregada. Mas você pode descarregar um AppDomain. O que você pode fazer é criar um novo AppDomain (AppDomain.CreateDomain (…)), carregar o assembly neste appdomain para trabalhar com ele e, em seguida, descarregar o AppDomain quando necessário. Ao descarregar o AppDomain, todos os assemblies que foram carregados serão descarregados. (Ver referência )

    Para chamar o coletor de lixo, você pode usar

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

    GC chama os finalizadores em um thread de segundo plano, é por isso que você tem que esperar e chamar Collect () novamente para ter certeza de que apagou tudo.

    Você pode usar outro 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); 

    Em vez de usar LoadFrom() ou LoadFile() você pode usar Load with File.ReadAllBytes() . Com isso, ele não usa o arquivo de assembly, mas o lê e usa dados de leitura.

    Seu código será semelhante a

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

    A partir daqui, não podemos descarregar o arquivo, a menos que todos os domínios contidos nele sejam descarregados.

    Espero que isto ajude.:)

    Você não pode descarregar o assembly do AppDomain atual. Mas você pode criar um novo AppDomain, carregar assemblies nele, executar algum código dentro do novo AppDomain e depois descarregá-lo. Verifique o seguinte link: MSDN