Проблема перенаправления связывания в .net
У меня есть библиотека классов, называемая "MyAssembly", которая внутренне ссылается на a.dll, b.dll версии 3.1.1.0; Я создал проект, который вывел MyAssembly.dll. В другой системе (ящик) я создал проект веб-приложения и ссылался на MyAssembly.dll. новая система имеет новые версии a.dll и b.dll 4.0.0; Я использовал привязку переадресации в web.config, как показано ниже. Но все еще не удается скомпилировать веб-приложение. он говорит, что отсутствует ссылка на сборку a.dll, версия 3.1.1.0.
Может ли какой-нибудь орган помочь в решении этой проблемы?
Спасибо,
Суреш
Ответы
Ответ 1
Это полностью сработало для меня. ПРИМЕЧАНИЕ. В теге configuration
вам нужно НЕТ пространства имен. И вы ДОЛЖНЫ иметь пространство имен в тэге assemblyBinding
.
<assemblyBinding> Element for <runtime>
<!-- important: no namespace -->
<configuration>
<runtime>
<!-- important, must have this namespace -->
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Strongly.Named.Assembly" publicKeyToken="xxx" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Сделайте оба из них, иначе он его не прочитает. Если он сообщает об ошибке, что в этом примере он не может загружать ничего, кроме 2.0.0.0, то он не правильно подбирает элементы конфигурации.
Это также работает только на сильно названных сборках. Чтобы узнать, есть ли что-то сильно, запустите следующую команду из окна командной строки VC
открыть (меню "Пуск" > все программы > визуальная студия > инструменты визуальной студии > команда командной строки visual studio)
Затем запустите:
sn -vf "path-to-assembly.dll"
Если он вернет, что он действителен, то он сильно назван.
Источник:
http://blog.codingoutloud.com/2010/03/13/three-ways-to-tell-whether-an-assembly-dl-is-strong-named/
Ответ 2
Это должно работать.
<runtime>
<dependentAssembly>
<assemblyIdentity name="MyAssembly" publicKeyToken="12233444"/>
<bindingRedirect oldVersion="3.1.1.0" newVersion="4.0.0.0"/>
</dependentAssembly>
</runtime>
Другое предложение: Удалить пространство имен из тэга конфигурации:
Вместо
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
попробовать
<configuration>
Ответ 3
Вы используете MyAssembly в своем веб-приложении. Перенаправление привязки будет использоваться для этой сборки, а не для сборок, которые использует MyAssembly. Проверьте манифест для MyAssembly.dll, он должен ссылаться на версии a.dll 3.1.1.0, поэтому отображается ошибка компилятора. Создайте MyAssembly с ссылкой на a.dll версии 4.0.0.0, а затем используйте MyAssembly в своем веб-приложении. Это будет работать.
Ответ 4
Попробуйте следующим образом:
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="a.dll"
publicKeyToken="{put a.dll publicKeytoken here}"
culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-99.99.99.99"
newVersion="4.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="b.dll"
publicKeyToken="{put b.dll publicKeytoken here}"
culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-99.99.99.99"
newVersion="4.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
Кроме того, перейдите к ссылкам вашего приложения, щелкните правой кнопкой мыши файл a.dll и b.dll, перейдите к свойствам и установите флажок "Специфическая версия" на False.
Надеюсь, что это поможет.