Как остановить ASP.NET от загрузки всех сборок из корзины при первой загрузке
Прикладное приложение DotNet загрузит все ссылочные сборки (и их ссылки) при первом использовании. Тем не менее, ASP.NET будет загружать все ссылочные сборки (и их ссылки) при первом доступе.
-
Правильно ли это понимание?
-
Есть ли способ заставить ASP.NET загружать сборки по требованию (например, локальные приложения)?
-
Конкретный сценарий, который я пытаюсь решить, заключается в следующем:
- Папка bin содержит 2 файла: A.dll и B.dll.
- Ссылки A.dll B.dll.
- B.dll ссылается на C.dll, который находится где-то еще в системе. В этом случае отсутствует C.dll.
- A.dll загружается (используя отражение) основным приложением.
- Ошибка (не удалось загрузить файл или сборку...) связана с отсутствующей зависимостью B.dll.
- Мы хотим, чтобы приложение функционировало нормально, если C.dll отсутствует, поскольку это дополнительный компонент основного приложения.
- Мы не контролируем содержимое B.dll или C.dll.
Ответы
Ответ 1
Чтобы ответить на точку 3, параметр, который вызывает загрузку всех сборок в папке bin при первом доступе, можно найти в файле C:\winnt\Microsoft.NET\Framework\v2.0.50727\CONFIG\web. config (в зависимости от вашей среды). Вырезать вырез из этого файла:
<system.web>
<compilation>
<assemblies>
<add assembly="*" />
</assemblies>
</compilation>
</system.web>
Все сборки, соответствующие шаблону, загружаются как часть исходной компиляции.
Изменив файл web.config для приложения ( НЕ глобальный DotNet), чтобы включить сборку веб-службы и исключить совпадение с подстановочным знаком, похоже, что приложение может работать, если дополнительные зависимости отсутствует:
<system.web>
<compilation>
<assemblies>
<remove assembly="*" />
<add assembly="Main.Application.WebService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=YOURKEYHERE" />
</assemblies>
</compilation>
</system.web>
Мы все еще экспериментируем с этим, поэтому не уверены, полностью ли это устраняет проблему или какие-либо необычные побочные эффекты.
Ответ 2
asp.net загружает все необходимые сборки, потому что рабочий процесс создает домен приложения со всеми необходимыми сборками для каждого экземпляра.
если вы хотите загружать сборки по требованию, попробуйте использовать отражение таким образом, вы можете контролировать, когда и когда загружать сборки.
** изменить: **
если у вас нет контроля над B и C, но вы говорите, что B нуждается в C для запуска, и A имеет жесткую ссылку на B. мне кажется, что вам нужны компоненты ABC для работы, вы можете попытаться удалить B от A, делая его рыхлой парой.
вы можете использовать отражение для загрузки B из A, но B все еще нуждается в C, чтобы он все еще вызывал проблемы.
как компилируется ваше решение с помощью компонента C?
есть C, хранящийся в GAC?