2011-06-25 11 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 
}; 

は私の質問に記載されたラインで破ったとき、私は今でも、アプリケーションドメインをアンロードすることなく、プラグインのアセンブリを削除することができます。

+0

私はhttps://stackoverflow.com/questions/46067782/appdomain-doesnt-make-shadow-filesに私の問題を掲載しました。それをご覧ください。 –

関連する問題