3

利用可能なプラグインのリストを調べるために使用している小さなクラスは次のとおりです。

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によってロードされたアセンブリをシャドウコピーする必要があることを指定しているのに、なぜそれらはアプリケーションによってロックされているのですか?

4

1 に答える 1

4

私はそれを考え出した。見逃した物件が1つありましたAppDomainSetup。プロパティはでしたShadowCopyDirectories

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

私の質問で言及された行を壊すとき、AppDomainをアンロードしなくてもプラグインアセンブリを削除できるようになりました。

于 2011-06-25T20:34:59.093 に答える