Как заставить перенаправление сборки работать в веб-приложении .net 4.0 - PullRequest
2 голосов
/ 18 ноября 2011

Я работаю над веб-приложением, использующим asp.net 4.0.

У меня есть несколько библиотек, которые я использую в GAC, у которых есть некоторые встроенные зависимости от старых библиотек.

Я настроил сборки так, чтобы зависимость перенаправлялась на правильную версию dll на моем компьютере. Это прекрасно работает в приложениях версии 3.5 или ниже, однако, когда я пытаюсь создать приложение asp.net 4.0 на основе тех же библиотек, оно захлебывается с ошибкой вроде:

Could not load file or assembly 'ControlReferencedByMyDll, Version=2.0.0.0, 
Culture=neutral, PublicKeyToken=XXXXXXXXXXXXXXXX' or one of its dependencies.
The located assembly's manifest definition does not match the assembly reference. 
(Exception from HRESULT: 0x80131040) 

где моя версия ControlReferencedByMyDll - версия 2.0.1.0.

Я не смог найти утилиту конфигурации GAC для .net 4.0, но в моем файле machine.config (в папках Framework и Framework64 для .net 4.0) я добавил что-то вроде:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="ControlReferencedByMyDll" PublicKeyToken="XXXXXXXXXXXXXXXX"/>
      <bindingRedirect oldVersion="1.0.0.0-9.9.9.9" newVersion="2.0.1.0"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>

чтобы увидеть, была ли это проблема.

Я даже пытался добавить атрибут applyTo = "v2.0.50727" в assemblyBinding, чтобы увидеть, если это имеет значение.

но, похоже, нет.

Кто-нибудь еще имел эту проблему? и что более важно, кто-нибудь может помочь мне решить эту проблему?

Ответы [ 2 ]

5 голосов
/ 16 ноября 2012

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

У меня было перенаправление как:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="test.dll" PublicKeyToken="XXXXXXXXXXXXXXXX"/>
      <bindingRedirect oldVersion="1.0.0.0-9.9.9.9" newVersion="2.0.1.0"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>

И, хотя он работал в предыдущих версиях, он не работал и на 4.0.

Я убрал «.dll» из названия, и теперь он работает !!!

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="test" PublicKeyToken="XXXXXXXXXXXXXXXX"/>
      <bindingRedirect oldVersion="1.0.0.0-9.9.9.9" newVersion="2.0.1.0"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>

Надеюсь, это поможет следующему бедняге, который пару часов ломает голову.

0 голосов
/ 21 ноября 2011

Хорошо, я не видел никаких дополнительных отзывов, и на данный момент я не определил, перезаписывается ли файл .config между machine.config и web.config, но это то, что работает.

Я добавляю код, подобный следующему:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="ControlReferencedByMyDll" PublicKeyToken="XXXXXXXXXXXXXXXX"/>
      <bindingRedirect oldVersion="1.0.0.0-9.9.9.9" newVersion="2.0.1.0"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>

Прямо в мой файл web.config.

Я отправляю это как ответ на свой собственный вопрос, но, как указано ранее, если вам случится узнать лучший способ или вы знаете, что является причиной разрыва между machine.config и web.config, пожалуйста, поделитесь.

Спасибо

...