AppDomain阴影复制无法正常工作(原始程序集已锁定)

这是我用来探测可用插件列表的一个小类:

internal static class PluginDirectoryLoader { public static PluginInfo[] ListPlugins(string path) { var name = Path.GetFileName(path); var setup = new AppDomainSetup { ApplicationBase = path, ShadowCopyFiles = "true" }; var appdomain = AppDomain.CreateDomain("PluginDirectoryLoader." + name, null, setup); var exts = (IServerExtensionDiscovery)appdomain.CreateInstanceAndUnwrap("ServerX.Common", "ServerX.Common.ServerExtensionDiscovery"); PluginInfo[] plugins = null; try { plugins = exts.ListPlugins(); // <-- BREAK HERE } catch { // to do } finally { AppDomain.Unload(appdomain); } return plugins ?? new PluginInfo[0]; } } 

path参数指向包含要加载的插件程序集的子目录。 我们的想法是使用启用了卷影复制的单独AppDomain加载它们。

这种情况下,因为AppDomain被快速卸载,所以不需要进行卷影复制,但是当我实际在我打算编写的下一个代码块中加载插件时,我想使用卷影复制,以便可以更新二进制文件苍蝇 我已经在这个类中启用了影子复制作为测试,以确保我做得对。

显然我做得不对,因为当我在代码示例中的注释行中调试调试器(即plugins = exts.ListPlugins() )时,原始插件程序集被应用程序锁定!

看到我指定由AppDomain加载的程序集应该被复制阴影,为什么它们被应用程序锁定?

我想到了。 我在AppDomainSetup错过了一个属性。 该属性是ShadowCopyDirectories

 var setup = new AppDomainSetup { ApplicationBase = path, ShadowCopyFiles = "true", ShadowCopyDirectories = path }; 

打破我的问题中提到的那一行,即使不卸载AppDomain,我现在也可以删除插件程序集。