Ответ 1
Я нашел его
Чтобы заставить ваше приложение читать из локального каталога bin, вы должны удалить подпись из своей сборки, а затем приложение загрузит сборку из bin.
Спасибо Wyatt Barnett и murad.
Есть ли способ заставить приложение asp.net загружать сборку из локального каталога bin, так как есть еще одна старая версия сборки с тем же именем в gac?
Я не могу удалить версию gac, поскольку другие приложения используют ее, и мне приходится сталкиваться с некоторыми трудностями при добавлении более новой версии в gac.
Я нашел его
Чтобы заставить ваше приложение читать из локального каталога bin, вы должны удалить подпись из своей сборки, а затем приложение загрузит сборку из bin.
Спасибо Wyatt Barnett и murad.
Измените номер версии, сильное имя сборки и ссылку на сильно названную более высокую версию, которую вы развертываете с вашим решением.
Работает конфигурация 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" />
И что это.
Основываясь на выписанных примечаниях по порядку загрузки сборки в этом ответе: Как предотвратить приложение .NET из загрузки/ссылки на сборку из GAC?
Я предполагаю, что вызов LoadLibrary в локальном DLL файле, прежде чем запрашивать библиотеку для загрузки в виде сборки, может переместить ее в порядке поиска для вас.
К сожалению, я не уверен, как заставить ваш вызов LoadLibrary работать до того, как среда начнет загружать ссылки на сборку.
Итак, это всего лишь идея, а не полный ответ.
В качестве альтернативы предлагаемому решению во время разработки вы можете привязать любую сборку, которую хотите полностью переопределить 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"
Чтобы перенаправить одну версию на другую, используйте <bindingRedirect> элемент. Атрибут oldVersion может указывать либо одну версию, либо ряд версий. Например, указывает, что среда выполнения должна использовать версию 2.0.0.0 вместо версий сборки между версиями 1.1.0.0 и 1.2.0.0.
s
Вместо использования 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 веб-приложения.
Почему бы не установить версию, которая вам нравится, в GAC, а затем ссылаться на нее в GAC?