2013-07-24 3 views
3

Je suis en train de charger un autre ensemble à l'aideEst-ce que Assembly.LoadFrom conserve un handle de fichier ouvert?

Assembly.LoadFrom("path.exe"); 

et après que je ne peux pas semblent supprimer que exe du système de fichiers. donc je me demandais si ce chemin conserve une poignée de fichier ouverte et comment je peux le fermer?

+0

Supprimer le * quand *? Lorsque votre programme est terminé ou lorsqu'il est encore en cours d'exécution? – m0skit0

+0

@ m0skit0: quand il est encore en cours d'exécution. quand je sais que je n'aurai plus besoin de rien de cet assemblage. – clamp

Répondre

6

Oui, il est ouvert jusqu'à ce que l'ensemble soit déchargé du domaine d'application.

Si vous avez vraiment besoin de supprimer le fichier, chargez son contenu en mémoire. L'utilisation Assembly.Load(byte[]) pour charger l'assemblage:

using (Stream stream = File.OpenRead("path.exe")) 
{ 
    byte[] rawAssembly = new byte[stream.Length]; 
    stream.Read(rawAssembly, 0, (int)stream.Length); 
    Assembly.Load(rawAssembly); 
} 
+0

merci, comment puis-je le décharger? – clamp

+0

et une autre question: si je charge deux fois le même assemblage, cela ouvrira-t-il un autre fichier ou réutilisera-t-il le premier? – clamp

+0

Vous ne pouvez pas le décharger sans décharger tout l'appdomain. Avec 'AppDomain.Unload()'. –

2

Par défaut, les fichiers sont verrouillés, mais .NET a une fonctionnalité appelée clichés instantanés, où il fera une copie de l'ensemble et charger qu'au lieu. ASP.NET s'appuie sur cela pour permettre aux sites Web d'être mis à jour sans rencontrer ces problèmes de verrouillage.

Voir cette rubrique Shadow Copying Assemblies sur MSDN pour plus de détails.

Questions connexes