Принудительное приложение ASP.NET для загрузки сборки из bin, а не из GAC
Есть ли способ заставить мое приложение asp.net загрузить сборку из локального каталога bin, поскольку в gac есть другая более старая версия сборки с тем же именем?
Я не могу удалить версию gac, так как другие приложения используют ее, и я сталкиваюсь с некоторыми трудностями при добавлении более новой версии в gac.
8 ответов
Я нашел это
Чтобы заставить ваше приложение читать из локального каталога bin, вы должны удалить подпись из вашей сборки, а затем приложение загрузит сборку из bin.
Спасибо Уайетту Барнетту и Мураду.
Измените номер версии, укажите строгое имя сборки и укажите версию со строгим именем, которую вы используете в своем решении.
Конфигурация oldVersion, предложенная Muse VSExtensions, работает! Вы можете использовать строгое имя для локальной сборки: посмотрите эту страницу: http://msdn.microsoft.com/en-us/library/7wd6ex19.aspx
В основном в web.config добавить что-то вроде:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="DllName"
publicKeyToken="0123456789abc"
culture="neutral" />
<!-- Assembly versions can be redirected in app,
publisher policy, or machine configuration files. -->
<bindingRedirect oldVersion="2.0.0.0-2.5.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
Таким образом, если у меня есть сборка в gac, которая может быть от версии 2.0.0.0 до версии 2.5.0.0, все вызовы будут перенаправлены на newVersion (3.0.0.0)
В разделе сборок я добавил сборку:
<add assembly="DllName, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0123456789abc" />
И это все.
В качестве альтернативы предлагаемому решению, во время разработки вы можете привязать к любой сборке, которую хотите, полностью перекрывая GAC, установив DEVPATH
переменная среды и включение режима разработки в machine.config
, Я думаю, что это самый простой способ достичь того, чего вы хотите, но его не следует использовать в производстве.
Это решает проблему, когда версия вашей сборки и версия в GAC совпадают, если версии разные, вы должны использовать bindingRedirect
подход, упомянутый здесь несколькими пользователями.
Сначала добавьте следующее machine.config
:
<configuration>
<runtime>
<developmentMode developerInstallation="true"/>
</runtime>
</configuration>
Затем установите DEVPATH
переменная окружения для расположения ваших не подписанных сборок. Это заставит режим Fusion DEVOVERRIDE активировать и искать DEVPATH
(и его подкаталоги) до исследования GAC.
FAQ по DEVPATH
а также DEVOVERRIDE
на MSDN ответит на большинство вопросов о последствиях использования этого.
Fusion (загрузчик сборок.NET) будет искать только по имени и версии, он будет обрабатывать строго именованные сборки так же, как другие сборки, не будет искать GAC перед поиском DEVPATH
и просто возвращает первое найденное совпадение. Вы должны использовать Fusion Log Viewer (fuslogvw), чтобы убедиться, что вы правильно его включили, как описано в этом посте на DEVPATH
,
Новое в использовании FusLogVw? Скотт Хансельман написал отличное вступление. Интерфейс Viewer довольно архаичен и требует некоторого привыкания.
Обратите внимание, что Fusion Log Viewer (или Просмотр журнала привязок сборок, что в названии) будет смущенно говорить, что вы использовали DEVOVERRIDE
переменная окружения. Это должно выглядеть примерно так:
LOG: Found assembly in DEVOVERRIDE path D:\testassemblies\Test.DLL
ПРИМЕЧАНИЕ: если вы хотите, чтобы Visual Studio загружал сборки из DEVPATH
местоположение, вы должны установить ключ реестра для этого местоположения, т.е. установить (проверьте ключ версии.NET, чтобы соответствовать вашей версии.NET):
[HKEY_CURRENT_USER\
SOFTWARE\
Microsoft\
.NETFramework\
v2.0.50727\AssemblyFoldersEx\
DEVPATH]@="C:\SharedAssemblies"
На основе выдержек из примечаний о порядке загрузки сборок в этом ответе: Как предотвратить загрузку / ссылку приложения из.NET на сборку из GAC?
Я предполагаю, что вызов LoadLibrary для локального файла DLL, прежде чем просить библиотеку загрузить как сборку, может переместить ее вверх в порядке поиска для вас.
К сожалению, я не уверен, как запустить ваш вызов LoadLibrary до того, как среда начнет загружать ссылочные сборки.
Так что это всего лишь идея, а не полный ответ.
Чтобы перенаправить одну версию в другую, используйте элемент
s
Вместо использования bindingRedirect вы можете указать путь к базе кода. У меня есть рабочий пример с MySQL.Data.dll.
<dependentAssembly>
<assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />
<codebase version="5.2.5.0" href="/bin/MySQL.Data.dll" />
</dependentAssembly>
Это можно сделать в Web.config веб-приложения.
Почему бы не установить понравившуюся вам версию в GAC, а затем сослаться на нее в GAC?