在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仍处于过程,它不会让你有机会,直到整个过程完成(在一个术语中它将有一个锁)。 如果您想重新编译,请尝试更改文件夹。它应该工作。
嗯。我没有考虑第二个文件夹...会不会创建有两个DLL加载相同的名称和方法等问题? – Quarty
它只会在目标文件夹为1时发出抱怨 – Vivek