AppDomain 卷影复制不起作用(原始程序集被锁定)

Posted

技术标签:

【中文标题】AppDomain 卷影复制不起作用(原始程序集被锁定)【英文标题】:AppDomain shadow copying not working (original assemblies locked) 【发布时间】:2011-06-25 19:51:33 【问题描述】:

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

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】:

我想通了。我在AppDomainSetup 错过了一处房产。该属性是ShadowCopyDirectories

var setup = new AppDomainSetup

    ApplicationBase = path,
    ShadowCopyFiles = "true",
    ShadowCopyDirectories = path
;

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

【讨论】:

我已在***.com/questions/46067782/… 上发布了我的问题,请您调查一下。

以上是关于AppDomain 卷影复制不起作用(原始程序集被锁定)的主要内容,如果未能解决你的问题,请参考以下文章

将目录添加到 ASP.NET 卷影副本

需要在 32/64 位 QT C++ 程序中使用卷影复制服务

Windows 卷影复制错误:2155348129

C#里的应用程序域AppDomain

AppDomain.CreateInstanceAndUnwrap 在网站中不起作用

C 中的卷影复制服务 (VSS) 示例?