提前抱歉我不确定我是否正确地表达了这个问题,这是我的情况......使用.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);
}
}
答案 0 :(得分:0)
可能有很多可能的原因,但我想的主要原因是,当你从之前的编译中重新编译一些dll时仍然在进行中它不会让你有权访问,直到整个过程完成(在一个术语,它将有一个锁)。 如果要重新编译,请尝试更改文件夹。它应该工作。