Принудительное приложение ASP.NET для загрузки сборки из bin, а не из GAC - PullRequest
16 голосов
/ 13 июня 2009

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

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

Ответы [ 8 ]

8 голосов
/ 14 июня 2009

Я нашел это

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

Спасибо Уайетту Барнетту и Мураду.

5 голосов
/ 13 июня 2009

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

2 голосов
/ 10 июня 2016

В качестве альтернативы предлагаемому решению, во время разработки вы можете привязать к любой сборке, которую хотите, полностью перекрывая 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 (или средство просмотра журнала привязки сборки, как указано в названии) смущает, что вы использовали переменную среды 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"
2 голосов
/ 03 июля 2013

Старая конфигурация, предложенная 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, все вызовы будут перенаправлены на новую версию (3.0.0.0)

В раздел сборок я добавил сборку:

<add assembly="DllName, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0123456789abc" />

И это все.

1 голос
/ 21 ноября 2013

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

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

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

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

0 голосов
/ 15 апреля 2016

Вместо использования 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 веб-приложения.

0 голосов
/ 29 апреля 2010

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

S

0 голосов
/ 28 июля 2009

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

...