Ссылка на System.Net.Http NuGet 4.3.0 генерирует System.IO.FileLoadException в System.Diagnostics.DiagnosticSource ver 4.0.0.0 ссылка

Описание проблемы:

Справочная информация по общей библиотеке "shared.dll". Пакет System.Net.Http NuGet 4.3.0. Приложение, которое ссылается на "shared.dll", терпит неудачу с помощью

System.IO.FileLoadException

Не удалось загрузить файл или сборку "System.Diagnostics.DiagnosticSource, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51" или одну из его зависимостей. Расположенное определение манифеста сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)

в System.Net.Http.WinHttpHandler.SendAsync(...)

После изучения этой проблемы мы пришли к следующей причине для вышеуказанного отказа:

  • Страница с информацией о пакете System.Net.Http v 4.3.0 утверждает зависимость от System.Diagnostics.DiagnosticSource v 4.3.0 или выше. Этот пакет автоматически загружается, когда System.Net.Http v 4.3.0 ссылается на проект.
  • Пакет NuGet System.Net.Http v 4.3.0 фактически включает System.Net.Http.dll v 4.1.1.0 (по состоянию на 8 января 2017 г.).
  • Пакет NuGet System.Diagnostics.DiagnosticSource v 4.3.0 фактически включает System.Diagnostics.DiagnosticSource v 4.0.1.0 (по состоянию на 8 января 2017 г.).
  • System.Net.Http ver 4.1.1.0 ссылки System.Diagnostics.DiagnosticSource v. 4.0.0.0 введите описание изображения здесь
  • System.Diagnostics.DiagnosticSource v. 4.0.0.0 не является точным соответствием v загруженной dll версии 4.0.1.0.
  • Когда версия сильно названной ссылки на библиотеку не соответствует точному, время выполнения .NET все еще пытается найти ссылочную сборку. Если он не может: генерируется исключение загрузки библиотеки. Также см. Следующий примечание

Есть несколько способов:

  • опция app.config: объявлять совместимые версии (как далеко мы должны пойти с этим?) с переадресацией переадресации в app.config для любого "shared.dll" - ссылка на приложение.
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
  </dependentAssembly>
</assemblyBinding>
  1. Force System.Diagnostics.DiagnosticSource.dll до версии 4.0.0.0: Добавьте ссылку NuGet к System.Diagnostics.DiagnosticSource v. 4.0.0.0 в проекты, ссылающиеся на System.Net.Http, чтобы упредить автоматическую загрузку dll версии 4.0.1.0. Этот параметр теряет способность автоматически обновлять зависимость NuGet, но делает развертывание приложений без конфигурации.

Существует чувство ловкости, хотя правильное решение проблемы заключается в исправлении вышеупомянутых несоответствий пакетов NuGet владельцами пакетов. При исправлении в источнике не требуется обходного пути для использования кода пакета System.Net.Http.

Вопросы:

  • Почему пакет System.Net.Http v 4.3.0 содержит несоответствие System.Net.Http.dll v 4.1.1, хотя есть более ранний точный пакет версии 4.1.1?
  • Должны ли мы продолжить любое из двух обходных решений, упомянутых выше?
  • Какой из них лучше?
  • Или: есть ли другое решение проблемы?
  • Или: есть ли неизбежное обновление пакетов NuGet, устраняющих несогласованность?

Спасибо.

Ответ 1

Я считаю, что было бы правильно ответить на мой собственный вопрос, потому что 99% ответа уже есть.

Команда разработчиков в github/corefx признала эта проблема разрешением будет побочным эффектом другого известная проблема исправить по причине удаления жесткой ссылки на System.Diagnostics.DiagnosticSource.dll из проекта System.Net.Http.

До тех пор: любой из двух предоставленных обходных путей подходит для использования на основе личных предпочтений.

Ответ 2

Я решил эту проблему, установив System.Net.Http (версия 4.3.1) из NuGet.

Ответ 3

В моем случае

FileLoadException: не удалось загрузить файл или сборку 'System.Diagnostics.DiagnosticSource, версия = 4.0.3.0, культура = нейтральная, Public KeyToken = cc7b13ffcd2ddd51'. Расположенное определение манифеста сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)

Началось, когда к проекту Asp.Net Core 2.0 был добавлен пакет Microsoft.AspNetCore.TestHost "2.1.0-preview2-final". Исправлено было установить стабильную версию "2.0.2"