Теневое копирование AppDomain не работает (исходные сборки заблокированы) - PullRequest
3 голосов
/ 25 июня 2011

Вот небольшой класс, который я использую для поиска списка доступных плагинов:

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 указывает на подкаталог, содержащий сборки плагинов для загрузки.Идея состоит в том, чтобы загрузить их, используя отдельный домен приложений с включенным теневым копированием.

В в этом случае теневое копирование на самом деле не требуется, поскольку домен приложений быстро выгружается, но когда я на самом делезагрузите плагины в следующем блоке кода, который я собираюсь написать, я хочу использовать теневое копирование, чтобы двоичные файлы могли обновляться на лету.Я включил теневое копирование в этом классе в качестве теста, чтобы убедиться, что я все делаю правильно.

Видимо, я не делаю это правильно, потому что, когда я ломаю отладчик на закомментированной строке в примере кода(т. е. plugins = exts.ListPlugins()), исходные сборки плагинов заблокированы приложением!

Поскольку я указываю, что сборки, загруженные AppDomain, должны быть теневым копированием, почему они блокируются приложением?

1 Ответ

4 голосов
/ 26 июня 2011

Я понял это.Был один объект, который я пропустил в AppDomainSetup.Свойство было ShadowCopyDirectories.

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

При разрыве строки, упомянутой в моем вопросе, теперь я могу удалять сборки плагинов даже без выгрузки AppDomain.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...