Принудительное приложение 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 до того, как среда начнет загружать ссылочные сборки.

Так что это всего лишь идея, а не полный ответ.

Чтобы перенаправить одну версию в другую, используйте элемент . Атрибут oldVersion может указывать либо одну версию, либо диапазон версий. Например, указывает, что среда выполнения должна использовать версию 2.0.0.0 вместо версий сборки между 1.1.0.0 и 1.2.0.0.

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?

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