利用可能なプラグインのリストを調べるために使用している小さなクラスは次のとおりです。
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によってロードされたアセンブリをシャドウコピーする必要があることを指定しているのに、なぜそれらはアプリケーションによってロックされているのですか?