在C#MVC,Assembly中使用MEF加载一些DLL,我该如何卸载它们?

问题描述:

对不起事先我不知道如果我正确措辞的问题,这是我的情况...使用.NET 4.6与MEF。在C#MVC,Assembly中使用MEF加载一些DLL,我该如何卸载它们?

我有一个核心网站,它在运行时检查DLL的模块文件夹,并将它们拖入组合容器/ MEF事物中,这让我可以在我的核心中使用第三方项目的视图/控制器。

要允许强类型,我也跟着this guide这表明使得在PreApplicationStartMethod动态链接库的卷影副本。

所有到目前为止的工作,真是太好了。

问题是当我停止调试或当服务器重新编译。 DLL没有正确释放,所以我第二次得到拒绝访问错误。当我尝试将DLL复制到卷影副本文件夹时发生错误。

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

我想这是在BuildManager.AddReferencedAssembly(assemblyDll),该文件锁定在......但有卸载的崩溃大会或者或启动一个可靠的方法?

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); 
     } 

    } 

可以有许多可能的原因,但为了这个,我认为主要的原因是当你从以前的编译重编译一些DLL仍处于过程,它不会让你有机会,直到整个过程完成(在一个术语中它将有一个锁)。 如果您想重新编译,请尝试更改文件夹。它应该工作。

+0

嗯。我没有考虑第二个文件夹...会不会创建有两个DLL加载相同的名称和方法等问题? – Quarty

+0

它只会在目标文件夹为1时发出抱怨 – Vivek