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

时间:2011-06-25 19:51:33

标签: c# .net reflection appdomain shadow-copy

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

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加载的程序集应该被复制阴影,为什么它们被应用程序锁定?

1 个答案:

答案 0 :(得分:4)

我明白了。我在AppDomainSetup错过了一处房产。该属性为ShadowCopyDirectories

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

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