3

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

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

4

1 回答 1

4

我想到了。我错过了一处房产AppDomainSetup。该物业是ShadowCopyDirectories

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

在我的问题中提到的线路中断时,即使不卸载 AppDomain,我现在也可以删除插件程序集。

于 2011-06-25T20:34:59.093 回答