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