Обязательная проблема перенаправления в .net - PullRequest
13 голосов
/ 18 ноября 2009

У меня есть библиотека классов под названием «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 ]

27 голосов
/ 17 августа 2012

Это полностью сработало для меня. ПРИМЕЧАНИЕ. Вам нужно НЕТ пространства имен в теге 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/

6 голосов
/ 18 ноября 2009

Это должно работать.

<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">

1009 * попробовать *

<configuration>
0 голосов
/ 17 апреля 2010

Попробуйте так:

<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.

Надеюсь, это поможет.

0 голосов
/ 17 марта 2010

Вы используете MyAssembly в своем веб-приложении. Перенаправление привязки будет использоваться для этой сборки, а не для сборок, используемых MyAssembly. Проверьте манифест для MyAssembly.dll, он должен ссылаться на версии 3.1.1.0 a.dll, следовательно, отображается ошибка компилятора. Создайте MyAssembly со ссылкой на a.dll версии 4.0.0.0, а затем используйте MyAssembly в своем веб-приложении. Это будет работать.

...