Страница входа MVC не может найти DLL, даже если она уже была загружена динамически - PullRequest
1 голос
/ 13 мая 2019

У меня есть страница входа в MVC, и я пытаюсь использовать некоторые файлы .DLL, которые я уже создал для других целей.Эти файлы .DLL действительно являются плагинами и находятся в папке /CorePlugins на моей веб-странице и загружаются динамически во время выполнения с помощью PreApplicationStartMethod .Вот как я загружаю эти .DLL:

var corePluginAssemblyFiles = CorePluginsFolder.GetFiles("*.dll", SearchOption.AllDirectories);

foreach (var assemblyFile in corePluginAssemblyFiles)
{
    var assembly = Assembly.LoadFile(assemblyFile.FullName);
    System.Web.Compilation.BuildManager.AddReferencedAssembly(assembly);
}

Теперь, среди этих плагинов, я на самом деле могу ссылаться туда и обратно любым способом, каким я хочу, и все работает нормально.Но при попытке использовать его со страницы входа в систему LoginController (, который находится в папке / bin, а не в папке / CorePlugins ), он говорит, что не может найти рассматриваемый .Dll:

Не удалось загрузить файл или сборку 'Core.API.UserMgmt, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null' или одна из ее зависимостей.Сетевой путь не найден.Описание: во время выполнения текущего веб-запроса произошло необработанное исключение.Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и ее возникновении в коде.

Сведения об исключении: System.IO.FileNotFoundException: Не удалось загрузить файл или сборку «Core.API.UserMgmt, версия = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null» или одна из его зависимостей.Сетевой путь не найден.

Исходный файл: C: \ svn \ HomeCenter_DEV \ HomeCenter \ HomeCenter.Core \ Controllers \ LoginController.cs Строка: 202

Отслеживание загрузки сборки: следующая информацияМожет быть полезно определить, почему не удалось загрузить сборку «Core.API.UserMgmt, версия = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null».

=== Информация о состоянии предварительной привязки ===

LOG: DisplayName = Core.API.UserMgmt, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null (указана полностью)

LOG: Appbase = file: ///C: /svn/HomeCenter_DEV/HomeCenter/HomeCenter.Core/

LOG: Initial PrivatePath = NULL

Вызов сборки: HomeCenter.Core, версия = 1.0.0.0, Culture = нейтральный, PublicKeyToken =null.

===

LOG: эта привязка запускается в контексте загрузки по умолчанию.

LOG: Использование файла конфигурации приложения: C: \ svn \ HomeCenter_DEV \ HomeCenter \ HomeCenter.Core \ web.config

LOG: Использование файла конфигурации хоста: C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ aspnet.config

LOG: Использование файла конфигурации компьютера из C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ config \ machine.config.

LOG: Политика не применяется к ссылке в настоящее время (частная, настраиваемая, частичная или привязка сборки на основе местоположения).

LOG: Такая же привязка была замечена ранее и была неудачной с помощью hr =0x80070035.

Так что просто для хихиканья я также поместил копию .DLL в папку / bin, и вот он сказал, что не может загрузить сборку, потому что она уже загружена.Так что теперь я думаю, что, черт возьми.Поэтому, используя некоторый тестовый код, я распечатал загруженные сборки из System.Web.Compilation.BuildManager.GetReferencedAssemblies () и из AppDomain.CurrentDomain.GetAssemblies () , и я действительно вижу.DLL Я пытаюсь использовать Core.API.UserMgmt, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.Так что здесь происходит?Почему он не может найти DLL, которая явно уже загружена.Если я помещаю .dll в папку / bin и удаляю ее из папки /CorePlugins, она работает, но тогда все остальное, что я настроил, разрывается.Мне нужно, чтобы DLL находился в папке /CorePlugins.

1 Ответ

0 голосов
/ 24 июня 2019

Я не могу вспомнить, какой пост, который я нашел, привел меня к решению этой проблемы, но, по сути, добавление элемента probing в раздел assemblyBinding в моем Web.Config - вот что решило это для меня.

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="folder\subFolder1;folder\subFolder2;folder\subFolder3" />
      <!--  Other stuff -->
</assemblyBinding>

Мне пришлось добавить корневую папку каждой DLL, которую я хотел включить, потому что я не мог понять, как заставить ее рекурсивно проходить по каталогу.

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