У меня есть AppDomain, который я использую для загрузки модулей в песочницу с:
class PluginLoader
{
public static AppDomain PluginSandbox;
static PluginLoader()
{
AppDomainSetup ads = new AppDomainSetup();
ads.ApplicationName = "Plugin Modules";
PermissionSet trustedLoadFromRemoteSourceGrantSet =
new PermissionSet(PermissionState.Unrestricted);
PluginSandbox =
AppDomain.CreateDomain("Plugin App Domain",
null, ads, trustedLoadFromRemoteSourceGrantSet);
}
А потом я извлеку нужную DLL и создаю экземпляр объекта:
public IPlugin FindPlugin(string pluginName)
{
ObjectHandle handle =
PluginSandbox.CreateInstance(pluginName,
"Plugins." + pluginName);
IPlugin ip = (IPlugin)handle.Unwrap();
return ip;
}
Пропускаю пару раз без проблем.Получение экземпляров различных объектов в Песочнице без проблем.
Чуть позже в коде, в другом методе, мне нужно найти сборку, чтобы получить встроенный ресурс (скомпилированный в файле данных, сManifestResource).Поэтому я звоню:
Assembly [] ar = PluginSandbox.GetAssemblies();
И выдается ошибка:
A first chance exception of type 'System.IO.FileNotFoundException'
occurred in PluginRunner.dll.
Additional information: Could not load file or assembly '10wl4qso,
Version=1.0.3826.25439, culture info=neutral, PublicKeyToken=null'
or one of its dependencies. The system cannot find the file specified.
Я не удивлен.'10wl4qso' не является названием сборки, dll или чем-то подобным.На самом деле это кажется псевдослучайным для каждого запуска.К тому же, дополнительное удовольствие от GetAssemblies
даже не задокументировано, чтобы вызвать это исключение.
Теперь я могу вызвать GetAssemblies
сразу после того, как я получаю начальный объект просто отлично, и все замечательно.Но через пару секунд другим способом я получаю это.Будучи удаленным, PluginSandbox не имеет никакой полезной информации в отладчике.
Я ловлю UnhandledException и DomainUnload на AppDomain, и ни один из них не запускается.
Почему мой AppDomain внезапно не знает оего сборки?Откуда эти данные мусора?Что я могу сделать, чтобы предотвратить то или другое?