Описание проблемы:
Справочная информация по общей библиотеке "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>
- 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, устраняющих несогласованность?
Спасибо.