在C#MVC中使用MEF,程序集加载一些DLL,如何卸载它们?

时间:2017-09-04 07:39:42

标签: c# .net dll mef

提前抱歉我不确定我是否正确地表达了这个问题,这是我的情况......使用.NET 4.6和MEF。

我有一个核心网站,在运行时,检查一个模块文件夹中的DLL并将它们拉到一个Composition Container / MEF中,这让我可以在我的核心中使用第三方项目的视图/控制器。 / p>

为了允许强类型,我遵循this guide,建议在PreApplicationStartMethod中制作DLL的卷影副本。

所有工作到目前为止,真的很棒。

当我停止调试或服务器重新编译时出现问题。 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);
        }

    }

1 个答案:

答案 0 :(得分:0)

可能有很多可能的原因,但我想的主要原因是,当你从之前的编译中重新编译一些dll时仍然在进行中它不会让你有权访问,直到整个过程完成(在一个术语,它将有一个锁)。 如果要重新编译,请尝试更改文件夹。它应该工作。