Невозможно загрузить сборку в новом домене приложения

У меня есть приложение 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).

Удачи.

Другие вопросы по тегам