Исключение System.TypeLoadException возникает при повторяющейся зависимости с другой версией - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть C# решение с несколькими C# проектами внутри.

Один проект зависит от двух dll, которые сами зависят от одной и той же dll, но разной версии, как показано здесь:

Project -> dll1.dll -> System.IdentityModel.Tokens.Jwt.dll (Version=5.4.0.0) 
Project -> dll2.dll -> System.IdentityModel.Tokens.Jwt.dll (Version=4.0.4.4)

Теперь, когда я использую dll2.dll, он выдает это исключение:

System.TypeLoadException: 'Could not load type 'System.IdentityModel.Tokens.JwtSecurityTokenHandler' from assembly 'System.IdentityModel.Tokens.Jwt, Version=5.4.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.'

Я читал об AutoGenerateBinding и пытался установить для него значение True и значение False, но оба результата привели к исключениям. Мне не хватает опыта работы с таким случаем, и мне нужны советы / хорошие статьи о том, как разрешить такой конфликт. Каков хороший подход, если я не имею контроля над реализацией dll1.dll или dll2.dll?

Есть ли чистое решение этой проблемы?

Редактировать:

Я добавил перенаправление привязки, как предлагается для всех случаев использования этой DLL в моем Проекты и установлены через Nuget во все той же версии:

<dependentAssembly>
    <assemblyIdentity name="System.IdentityModel.Tokens.Jwt" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.20622.1351" newVersion="4.0.20622.1351" />
  </dependentAssembly>

Все еще то же исключение, кажется, что требование от dll, на который ссылаются, каким-то образом перезаписывает требование от моего проекта. Я установил подробный уровень информации о сборке на подробный, поэтому во время перестройки я получаю следующий вывод: enter image description here

Есть ли во избежание, чтобы мой wi sh для точной версии через bindingRedirect перезаписывается?

Решено: Решено, как описано здесь stackoverflow . Я удалил все пакеты Nuget и связал их с той же самой DLL, на которую ссылается dll1. Кроме того, я удалил все перенаправления привязки и установил для AutoGenerateBindings значение False в настройках проекта.

1 Ответ

1 голос
/ 28 апреля 2020

Лучшее решение - избежать этого. Мы тратим значительное время на обновление всех проектов, чтобы использовать одну и ту же версию DLL. Однако, если вы не можете избежать этого, вы можете использовать Binding Redirects для очень подробного управления:

<runtime>
   <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
       <dependentAssembly>
          <assemblyIdentity name="System.Web.Http" publicKeyToken="31BF3856AD364E35" culture="neutral" />
          <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
       </dependentAssembly>
   </assemblyBinding>
</runtime>
...