ここで私が利用可能なプラグインのリストについて調べるために使用している小さなクラスです: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によって読み込まれたアセンブリをシャドウコピーするように指定しているのを見て、なぜアプリケーションによってロックされていますか?
私はhttps://stackoverflow.com/questions/46067782/appdomain-doesnt-make-shadow-filesに私の問題を掲載しました。それをご覧ください。 –