Я использую настраиваемую фреймворк, который использует отражение, чтобы сделать GetTypeByName(string fullName)
на полностью квалифицированном имени типа, которое он получает из базы данных, чтобы создать экземпляр указанного типа и добавить его в страница, в результате чего появилась стандартная модульная вещь.Сборка недоступна после изменения Web.config
GetTypeByName
является моей полезной функцией, которая просто выполняет итерации через Thread.GetDomain().GetAssemblies()
, а затем выполняет assembly.GetType(fullName)
, чтобы найти соответствующий тип. Очевидно, что этот результат будет кэшироваться для дальнейшего использования и скорости.
Однако у меня возникают некоторые проблемы, при которых обновляется web.config (и в некоторых более страшных случаях, если пул приложений получает рециркуляцию), он потеряет все знания определенных сборок, что приведет к невозможности визуализации экземпляр типа модуля. Отладка показывает, что отсутствующая сборка буквально не существует в списке текущих сборок потоков.
Чтобы обойти это, я добавил вторую проверку, которая немного грязна, но рекурсирует через DLL-файлы/bin/directory и проверяет, что каждый из них существует в списке сборок. Если это не так, он загружает его с помощью Assembly.Load и исправляет проблему контекста благодаря 'Solving the Assembly Load Context Problem'.
Это будет работать, только кажется, что (и я знаю, что это не должно быть возможным), некоторые проекты все еще имеют доступ к отсутствующей сборке, например, мой фактический веб-проект, а не сама фреймворк, а затем жалуется, что дубликаты ссылок были добавлены!
Кто-нибудь слышал о чем-либо подобном, или есть идеи, почему сборка просто выпадет из существования при изменении конфигурации? Какое из самых элегантных способов решения проблемы позволяет собрать все сборки в бункере? Это должно быть все в одном «хите», чтобы посетители сайта не видели никакой разницы, кроме небольшой задержки, поэтому файл app_offline.htm не может быть и речи. Программно переименовать DLL в бункер, а затем именовать его, работает, но требует «изменить» разрешения для учетной записи пользователя IIS, что является безумным.
Спасибо за любые указания, которые сообщество может собрать!
@ tags2k Можно поместить ссылку для загрузки DLL-файла, который создает проблему, чтобы проверить его с помощью отражателя, в точке ошибки (также на GetTypeByName). – Aristos