Не удалось загрузить DLL из-за перенаправления привязки - PullRequest
2 голосов
/ 15 октября 2019

У меня есть проект DLL, который использует пакет SendGrid Nuget. Для пакета SendGrid требуется пакет Nuget System.Net.Http 4.3.4. Этот проект DLL я затем упаковал в пакет Nuget.

Теперь у меня есть проект ASP.NET MVC, который включает в себя мой пакет Nuget. Из-за требований к зависимостям при установке устанавливаются SendGrid, System.Net.Http и другие зависимости.

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

System.IO.FileNotFoundException
HResult=0x80070002
Message=Could not load file or assembly 'System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.
Source=Bc3.Mail
StackTrace:
  at Bc3.Mail.MailHelper.SendMessage(SendGridMessage message) in C:\Code\Shared Libraries\Bc3.Mail\Bc3.Mail\MailHelper.cs:line 166
  at Bc3.Mail.MailHelper.SendMail(MailMessage mail) in C:\Code\Shared Libraries\Bc3.Mail\Bc3.Mail\MailHelper.cs:line 128
…

Теперь я запутался, так как думал, что установлена ​​версия 4.3.4. Я проверил версию System.Net.Http во всех моих проектах, и она говорит, что это версия 4.2.0.0. Хорошо, я запутался, почему он показывает 4.2, когда думал, что установил 4.3.4. Однако, если на мой проект ссылается 4.2, как он не может его найти?

Во всяком случае, затем я посмотрел свой файл web.config и увидел это

<dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0"/>
</dependentAssembly>

Я не знаючто-нибудь об этих перенаправлениях привязки. Но я решил удалить это, и все работало нормально.

Так что мой вопрос, почему?

Спасибо

1 Ответ

1 голос
/ 16 октября 2019

О перенаправлениях привязки

Перенаправления привязки позволяют среде выполнения выбирать альтернативные версии конкретной сборки. Связывание перенаправлений может быть полезным, поскольку они снижают строгость привязки к определенной версии сборки. Но они могут вызвать конфликты.

https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/redirect-assembly-versions

Переадресация привязки после добавления SendGrid

Я заметил, что добавление ссылки NUGET на SendGrid вставил следующие перенаправления привязки

  <dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.1.1.2" newVersion="4.1.1.2" />
  </dependentAssembly>

Создание пакета NUGET, использующего SendGrid

Я создал простой проект библиотеки классов, который ссылается на SendGrid, и сделалпакет NUGET. Я поместил этот пакет NUGET в свою личную папку каналов, а затем сослался на этот пакет NUGET из другого проекта Framework. Скомпилированный файл .CONFIG имел следующее перенаправление привязки

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
      </dependentAssembly>

Возможность

Мои мысли:

  1. Перенаправление привязки, которым вы являетесьпросмотр в web.config мог быть вызван непреднамеренной ссылкой на какой-то другой NUGET пакет
  2. Разрешить компилятору генерировать перенаправления привязки во время Создайте операцию вместо ручного добавления перенаправлений привязки в Web.config или app.config. Настройка проекта -> Вкладка приложения -> Автоматически генерировать перенаправления привязки должны быть проверены.

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

...