Ошибка, связанная с Net Standard из Net 4.6.1/4.7

У меня есть веб-приложение, первоначально нацеленное на 4.6.1. Это веб-приложение ссылается на библиотеку классов; в свою очередь, это ссылается на библиотеку классов Net Standard 1.6.

Добавление ссылки на библиотеку Net Standard было последним изменением и, похоже, вызвало его нарушение: веб-приложение работало нормально до тех пор, пока не была введена библиотека Net Standard; в этот момент я начал получать ошибку:

Не удалось загрузить файл или сборку "System.Runtime, Version = 4.1.0.0, Культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a 'или одна из ее зависимостей. Система не может найти указанный файл.

System.Runtime входит в пакет NuGet в веб-приложении.

Это может быть не актуально, но когда я смотрю в каталог пакетов; Я вижу, что System.Runtime.4.3.0\lib имеет каталоги net45 и net462, но не 4.6.1 или 4.7 (см. Ниже, почему я ожидал бы этого).

Некоторые вещи, которые я пробовал, которые не работали:

  • Несмотря на просмотр здесь, что 4.6.1 поддерживает Net Std 1.6, я действительно пытался обновление до 4.7, но безрезультатно.
  • Попробовал настроить перенаправление сборки в файле web.config. Это слегка меняет ошибку, чтобы сказать, что она ищет 4.0.0.0, а затем повторное нажатие, но по существу такая же ошибка.
  • Пробовал удалить каталог пакетов, чтобы проверить, могу ли я принудительно обновить (также попробовал Update-Package в System.Runtime).
  • При поиске в Интернете я нашел пару подобных проблем; один из GitHub (который я не могу переместить) подразумевал, что обновление VS2017 устранит проблему.

В Интернете достаточно свежих материалов, которые заставляют меня думать, что я не единственный человек, который испытывает это; хотя я не нашел объяснений относительно того, что может быть причиной. Может ли кто-нибудь дать объяснение относительно того, что может быть причиной этого, или какие-либо диагностические шаги, которые я могу использовать?

Ответ 1

У меня была аналогичная проблема, и я решил ее, удалив ссылку System.Runtime из проекта и установив ее через Nuget (совместимый с Net Standard). Это был не единственный пакет, у которого были проблемы (другой пример, System.Net.Http). Кроме того, если в вашем решении есть несколько проектов, вы должны установить Net Standard на каждом из них.

Ответ 2

Документы .NET Standard здесь и здесь имеют противоречивую информацию, когда дело доходит до .NET Framework. Я подозреваю, что последнее самое актуальное.

В основном это означает, что .NET Framework не поддерживается в .NET Standard 1.6, если у вас нет .NET Core 2.0 SDK.

В качестве альтернативы,.NET Standard 1.5 и ниже поддерживаются установленной SDK.NET Core 1.0.

Ответ 3

Стоит отметить, что NuGet установит самую последнюю версию фреймворка в или ниже целевой структуре вашего проекта. Это означает, что когда он был нацелен на 4.6.1, указанная версия была бы net45 или 4.5, которая полностью опустится до Net Standard 1.1.

Теоретически обновление до 4.7 должно означать, что оно ссылается на net462, но может быть, что это настолько кровоточащий край, что не все работает нормально. Вы пытались обновить до 4.6.2?

Ответ 4

После долгого процесса преобразования, который я описал здесь У меня есть опыт: вы должны установить пакет NuGet NETStandard.Library также в свой основной проект (в вашем веб-приложении .net 4.6.1). Он установит множество пакетов.

Я использую NETStandard.Library версии 1.6.1.

Если вы используете System.Runtime.Serialization в своем сетевом коде, вам также необходимо установить System.Runtime.Serialization.Primitives и System.Runtime.Serialization.Xml или .Json в основной проект.

А также все другие ссылки проекта netstandard также должны быть указаны в основном проекте.