Обязательная проблема перенаправления в.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.
Может ли какой-либо орган помочь в решении этой проблемы?
Спасибо суреш
4 ответа
Это полностью сработало для меня. ПРИМЕЧАНИЕ: вам не нужно пространство имен на 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 > инструменты Visual Studio > командная строка 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/
Это должно работать.
<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>
Вы используете MyAssembly в своем веб-приложении. Перенаправление привязки будет использоваться для этой сборки, а не для сборок, которые использует MyAssembly. Проверьте манифест для MyAssembly.dll, он должен ссылаться на версии 3.1.1.0 a.dll, следовательно, отображается ошибка компилятора. Создайте MyAssembly со ссылкой на a.dll версии 4.0.0.0, а затем используйте MyAssembly в своем веб-приложении. Это будет работать
Попробуйте так:
<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.
Надеюсь, поможет.