Невозможно загрузить сборку в новом домене приложения
У меня есть приложение MVC3. У меня есть подпапка в проекте приложения под названием "Плагины"
Все dll, хранящиеся в этой папке, должны обновляться во время выполнения, поэтому мы отложили appdomain и перезагрузили новую версию dll, поэтому я пытаюсь загрузить все dll плагина в другой appDomain и установить его свойства shadowCopy,
Просматривая SO, msdn и некоторые блоги, я дошел до этого "решения". (это вызывается во время моего Application_Start)
static AppDomain pluginDomain;
static PluginHolder()
{
AppDomainSetup domainSetup = AppDomain.CurrentDomain.SetupInformation;
domainSetup.ApplicationName = "Plugins";
domainSetup.PrivateBinPathProbe = domainSetup.PrivateBinPath;
domainSetup.PrivateBinPath = GetPluginsDirectory();
domainSetup.ShadowCopyFiles = "true";
domainSetup.ShadowCopyDirectories = domainSetup.PrivateBinPath;
pluginDomain= AppDomain.CreateDomain("Plugins", null, domainSetup);
var item = pluginDomain.Load(File.ReadAllBytes(GetPluginsDirectory() + "Item.dll"));
}
"Item.dll" - это DLL, которую я пытаюсь загрузить. В последней строке выдается "Не удалось загрузить элемент файла или сборки или одну из его зависимостей". Похоже, что так у других людей получилось, но у меня это не сработает.
У меня нет предыдущего опыта работы с доменами приложений, поэтому я не уверен, как решить эту проблему, или я правильно ее решаю.
Моя сборка загружается через новый AppDomain нормально?
1 ответ
Чтобы расшифровать такие сообщения об ошибках, вы должны использовать средство просмотра журнала привязки сборки.
Также обратите внимание на раздел замечаний на странице документации AppDomain.Load (byte []). Если вы хотите загрузить сборку в новый домен приложений, вам следует вместо этого использовать CreateInstanceAndUnwrap.
Если вы хотите внедрить механизм плагинов в.NET, вам нужно будет понять домены приложений, разрешение сборки и загрузку, а затем выбрать механизм связи между объектами из разных доменов приложений. Большинство хороших книг по.NET и CLR содержат одну или две главы о доменах приложений, и они помогут вам освоиться. Теперь, что касается связи между доменами приложений, вы можете использовать WCF или.NET Remoting ( MarshalByRefObject).
Удачи.