2015-04-16 6 views
2

Je suis en train de charger un assemblage, utilisez Reflection pour obtenir toute la classe à l'intérieur que .dll, puis supprimez le .dll. Cependant, je reçois une exception d'accès refusé en essayant de supprimer le .dll. Ce n'est pas dû aux droits d'accès car je peux supprimer le .dll si je ne le charge pas en premier.Comment décharger un assemblage chargé

J'ai regardé MSDN, et apparemment il n'y a aucun moyen de "décharger", mais j'espère qu'il pourrait y avoir une autre façon.

Assembly assembly; 
assembly = Assembly.LoadFrom(filepath); 

Type[] listOfAllClassInDll = assembly.GetTypes(); 
List<string> listOfAllClassNamesInDll = new List<string>(); 

     foreach (Type classInDll in listOfAllClassInDll) 
     { 
      listOfAllClassNamesInDll.Add(classInDll.Name); 
     } 

File.Delete(filepath); 
+1

Voir http://stackoverflow.com/questions/225330/how-to-load-a-net-assembly -for-reflection-operations-and-subséquente-unload-it ou use Mono.Cecil – xanatos

+0

@xanatos Il semble qu'aucune de mes classes 'ne puisse être chargée en utilisant ReflectionOnlyLoadFrom, elles lancent toutes une' ReflectionTypeLoadException '. Je ne sais pas si c'est un problème que je peux contourner comment. – Ralt

+0

En général, vous devrez les charger dans un autre AppDomain si vous voulez les décharger. Il n'est pas "bon" de charger des assemblages et ensuite de les décharger. Ils pourraient faire des "choses" en étant chargés. Pour cette raison, il y a 'ReflectionOnlyLoadFrom'. Je vous suggère d'essayer 'Mono.Cecil' – xanatos

Répondre

0

Au lieu d'utiliser LoadFrom/LoadFile vous pouvez utiliser la charge avec File.ReadAllBytes. Ici, vous n'utilisez pas le fichier d'assemblage directement, mais lisez son contenu et utilisez les données lues. Ainsi, vous êtes libre de renommer/supprimer le fichier.

Votre code ressemblera alors à:

Assembly assembly; 
assembly = Assembly.Load(File.ReadAllBytes(filepath)); 

Type[] listOfAllClassInDll = assembly.GetTypes(); 
List<string> listOfAllClassNamesInDll = new List<string>(); 

foreach (Type classInDll in listOfAllClassInDll) 
{ 
    listOfAllClassNamesInDll.Add(classInDll.Name); 
} 

File.Delete(filepath); 

Hope this helps :)