2011-06-25 26 views
3

這裏的小班我使用探測可用的插件列表:的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加載的程序集應該被複制,爲什麼它們被應用程序鎖定?

回答

3

我想通了。我在AppDomainSetup中錯過了一處房產。該物業是ShadowCopyDirectories

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

當在我的問題提到的換行,我現在就可以刪除插件組件,即使沒有卸載的AppDomain。

+0

我已經發布我的問題在https://stackoverflow.com/questions/46067782/appdomain-doesnt-make-shadow-files你可以看看,請。 –