Подтвердить что ты не робот

Принуждение приложения ASP.NET для загрузки сборки из bin не из GAC

Есть ли способ заставить приложение asp.net загружать сборку из локального каталога bin, так как есть еще одна старая версия сборки с тем же именем в gac?

Я не могу удалить версию gac, поскольку другие приложения используют ее, и мне приходится сталкиваться с некоторыми трудностями при добавлении более новой версии в gac.

4b9b3361

Ответ 1

Я нашел его

Чтобы заставить ваше приложение читать из локального каталога bin, вы должны удалить подпись из своей сборки, а затем приложение загрузит сборку из bin.

Спасибо Wyatt Barnett и murad.

Ответ 2

Измените номер версии, сильное имя сборки и ссылку на сильно названную более высокую версию, которую вы развертываете с вашим решением.

Ответ 3

Работает конфигурация 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" />

И что это.

Ответ 4

Основываясь на выписанных примечаниях по порядку загрузки сборки в этом ответе: Как предотвратить приложение .NET из загрузки/ссылки на сборку из GAC?

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

К сожалению, я не уверен, как заставить ваш вызов LoadLibrary работать до того, как среда начнет загружать ссылки на сборку.

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

Ответ 5

В качестве альтернативы предлагаемому решению во время разработки вы можете привязать любую сборку, которую хотите полностью переопределить GAC, установив переменную среды DEVPATH и включить Режим разработки в machine.config. Я думаю, что это самый простой способ добиться того, чего вы хотите, но не должны использоваться в производстве.

Это решает проблему, когда версия вашей сборки и одна в GAC одинаковы, если версии разные, вы должны использовать подход bindingRedirect, упомянутый здесь несколькими пользователями.

Сначала добавьте следующее в machine.config:

<configuration>
  <runtime>
    <developmentMode developerInstallation="true"/>
  </runtime>
</configuration>

Затем установите переменную среды DEVPATH в расположение ваших несанкционированных сборок. Это заставит режим Fusion DEVOVERRIDE зайти и искать DEVPATH (и его подкаталоги) перед зондированием GAC.

Часто задаваемые вопросы DEVPATH и DEVOVERRIDE в MSDN будут отвечать на большинство вопросов о последствиях использования этого.

Fusion (сборщик сборок .NET) будет искать только по имени и версии, он будет обрабатывать узлы с жесткими именами, равные другим сборкам, не будет искать GAC перед поиском DEVPATH и просто возвращает найденное первое совпадение. Вы должны использовать Fusion Log Viewer (fuslogvw), чтобы убедиться, что вы правильно включили его, как описано в этом сообщении в блоге DEVPATH.

Новое в использовании FusLogVw? Скотт Гензельман написал отличное вступление. Интерфейс Viewer довольно архаик и немного привыкает.

Обратите внимание, что средство просмотра журнала Fusion Logger (или Assembly Binding 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"

Ответ 6

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

s

Ответ 7

Вместо использования bindingRedirect вы можете указать путь codebase. У меня есть рабочий пример с 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 веб-приложения.

Ответ 8

Почему бы не установить версию, которая вам нравится, в GAC, а затем ссылаться на нее в GAC?