2017-09-04 9 views
0

Désolé d'avance, je ne suis pas sûr d'avoir bien formulé la question, voici ma situation ... Utiliser .NET 4.6 avec MEF. J'ai un site web central qui, lors de l'exécution, vérifie un dossier de modules pour les DLL et les place dans un conteneur Composition Container/MEF, ce qui me permet d'utiliser les vues/contrôleurs du projet tiers, dans mon cœur.Utilisation de MEF dans C# MVC, Assemblage Chargement de certaines DLL, comment les décharger?

Pour permettre un typage fort, j'ai suivi this guide ce qui suggère de créer une copie miroir des DLL dans un PreApplicationStartMethod.

Tout fonctionne jusqu'à présent, vraiment génial.

Le problème survient lorsque j'arrête le débogage ou lorsque le serveur recompile. Les DLL ne sont pas libérées correctement, donc je reçois des erreurs d'accès refusé la 2ème fois. L'erreur se produit lorsque j'essaie de copier des DLL dans le dossier de copie cliché.

The process cannot access the file '....dll' because it is being used by another process. 

Je pense qu'il est le BuildManager.AddReferencedAssembly (assemblyDll) qui verrouille le fichier ... mais est-il un moyen fiable pour décharger l'assemblage soit sur le crash ou au démarrage?

static PreApplicationInit() 
    { 
     PluginFolder = new DirectoryInfo(HostingEnvironment.MapPath("~/Modules")); 
     ShadowCopyFolder = new DirectoryInfo(HostingEnvironment.MapPath("~/Modules/temp")); 
    } 
public static void Initialize() 
    { 
     Directory.CreateDirectory(ShadowCopyFolder.FullName); 

     //clear out plugins) 
     foreach (var f in ShadowCopyFolder.GetFiles("*.dll", SearchOption.AllDirectories)) 
     { 
      f.Delete(); // -- Breaks here 
     } 

     //shadow copy files 
     foreach (var plug in PluginFolder.GetFiles("*.dll", SearchOption.AllDirectories)) 
     { 
      var di = Directory.CreateDirectory(Path.Combine(ShadowCopyFolder.FullName, plug.Directory.Name)); 
      File.Copy(plug.FullName, Path.Combine(di.FullName, plug.Name), true); // -- Or if Delete is Try Caught, Breaks here 
     } 

     foreach (var a in 
      ShadowCopyFolder 
      .GetFiles("*.dll", SearchOption.AllDirectories) 
      .Select(x => AssemblyName.GetAssemblyName(x.FullName)) 
      .Select(x => Assembly.Load(x.FullName))) 
     { 
      BuildManager.AddReferencedAssembly(a); 
     } 

    } 

Répondre

0

Il peut y avoir de nombreuses raisons possibles, mais la principale raison de cela, je pense, lorsque vous recompiler certains des dll de votre compilation précédente sont toujours en cours et il laissera pas vous avez accès jusqu'à ce que l'ensemble du processus est fini (qui dans un terme il aura un verrou). si vous souhaitez recompiler essayez de changer le dossier. ça devrait marcher.

+0

Hmm. Je n'ai pas considéré un 2ème dossier ... Cela ne créerait-il pas des problèmes d'avoir deux DLL chargées avec les mêmes noms et méthodes etc? – Quarty

+0

Il se plaindra seulement si le dossier de destination est un – Vivek