Вы должны добавить ссылку на сборку netstandard, Version = 2.0.0.0


124

Проект представляет собой веб-приложение ASP.NET MVC, ориентированное на .NET Framework 4.6.1.

Внезапно (некоторые пакеты NuGet были обновлены) во время выполнения я начал получать следующую ошибку:

CS0012: тип System.Object определен в сборке, на которую нет ссылки. Вы должны добавить ссылку на сборку netstandard, Version = 2.0.0.0, Culture = нейтральный, PublicKeyToken = cc7b13ffcd2ddd51.

На мой главный взгляд Index.cshtml, в строке, где я использую@Html.ActionLink

На моем компьютере установлены .NET Core SDK 2.0 и .NET Framework 4.7.1, но я не хочу включать ссылку на них. Это только веб-приложение .NET Framework, оно размещено в Windows IIS, где установлен фреймворк 4.6.1, на сервере не установлен NET Core.

Так почему он просит добавить ссылку на netstandard? Как я могу исправить это без ссылки netstandardна полную версию Windows .NET Framework 4.6.1?

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

Если опубликовать приложение в каталоге и запустить его с помощью IIS, оно работает.

Ссылка на .csproj gist

packages.config

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Antlr" version="3.5.0.2" targetFramework="net46" />
  <package id="BundleTransformer.Core" version="1.9.69" targetFramework="net46" />
  <package id="BundleTransformer.Handlebars" version="1.9.73" targetFramework="net46" />
  <package id="BundleTransformer.Less" version="1.9.69" targetFramework="net46" />
  <package id="BundleTransformer.Yui" version="1.9.52" targetFramework="net46" />
  <package id="Dapper" version="1.42" targetFramework="net46" />
  <package id="EcmaScript.Net" version="1.0.1.0" targetFramework="net46" />
  <package id="EntityFramework" version="6.0.0" targetFramework="net46" />
  <package id="Glimpse" version="1.8.6" targetFramework="net46" />
  <package id="Glimpse.AspNet" version="1.9.2" targetFramework="net46" />
  <package id="Glimpse.Mvc5" version="1.5.3" targetFramework="net46" />
  <package id="JavaScriptEngineSwitcher.Core" version="1.2.4" targetFramework="net46" />
  <package id="JavaScriptEngineSwitcher.V8" version="1.3.0" targetFramework="net46" />
  <package id="jQuery" version="2.1.3" targetFramework="net46" />
  <package id="jQuery.Validation" version="1.13.1" targetFramework="net46" />
  <package id="LowercaseDashedRoute" version="1.0.14" targetFramework="net46" />
  <package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net46" />
  <package id="Microsoft.jQuery.Unobtrusive.Validation" version="3.2.3" targetFramework="net46" />
  <package id="Microsoft.Owin" version="3.0.1" targetFramework="net46" />
  <package id="Microsoft.Owin.Host.SystemWeb" version="3.0.1" targetFramework="net46" />
  <package id="Microsoft.SqlServer.Compact" version="4.0.8876.1" targetFramework="net46" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net46" />
  <package id="Moment.js" version="2.10.2" targetFramework="net46" />
  <package id="Newtonsoft.Json" version="10.0.3" targetFramework="net46" />
  <package id="NWebsec" version="5.1.1" targetFramework="net46" />
  <package id="NWebsec.Core" version="2.1.0" targetFramework="net46" />
  <package id="NWebsec.Mvc" version="5.1.1" targetFramework="net46" />
  <package id="Owin" version="1.0" targetFramework="net46" />
  <package id="Respond" version="1.4.2" targetFramework="net46" />
  <package id="Sendgrid" version="6.3.0" targetFramework="net46" />
  <package id="SendGrid.SmtpApi" version="1.3.1" targetFramework="net46" />
  <package id="Serilog" version="2.6.0" targetFramework="net46" />
  <package id="Serilog.Enrichers.Environment" version="2.1.2" targetFramework="net46" />
  <package id="Serilog.Sinks.File" version="3.2.0" targetFramework="net46" />
  <package id="Serilog.Sinks.RollingFile" version="3.3.0" targetFramework="net46" />
  <package id="Serilog.Sinks.Sentry" version="2.1.4" targetFramework="net46" />
  <package id="SerilogWeb.Classic" version="2.1.17" targetFramework="net46" />
  <package id="SharpRaven" version="2.2.0" targetFramework="net46" />
  <package id="System.Data.SQLite" version="1.0.108.0" targetFramework="net46" />
  <package id="System.Data.SQLite.Core" version="1.0.108.0" targetFramework="net46" />
  <package id="System.Data.SQLite.EF6" version="1.0.108.0" targetFramework="net46" />
  <package id="System.Data.SQLite.Linq" version="1.0.108.0" targetFramework="net46" />
  <package id="Twitter.Bootstrap.Less" version="3.3.4" targetFramework="net46" />
  <package id="WebActivatorEx" version="2.0.6" targetFramework="net46" />
  <package id="WebGrease" version="1.6.0" targetFramework="net46" />
  <package id="YUICompressor.NET" version="2.7.0.0" targetFramework="net46" />
</packages>

При публикации приложения с использованием VS2017 в файловой системе я получаю следующее предупреждение на выходе:

Следующая сборка зависит от версии .NET Framework, которая выше целевой и может некорректно загружаться во время выполнения, вызывая сбой: netstandard, Version = 2.0.0.0, Culture = нейтральный, PublicKeyToken = cc7b13ffcd2ddd51. Зависимости: System.Transactions, Version = 4.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089. Вы должны либо убедиться, что зависимая сборка соответствует целевой платформе, либо убедиться, что целевая платформа, к которой вы обращаетесь, принадлежит зависимой сборке.

Но я ничего не могу найти System.Transactions. Как я могу найти то, что на него ссылается?


1
Какие пакеты NuGet вы используете? Вы уверены, что не ссылаетесь на ASP.NET Core?
Рикардо Перес

@RicardoPeres VS2017 не позволяет добавлять пакет, ориентированный на структуру, отличную от той, на которую нацелен проект. Я удалил и переустановил все пакеты, но ошибка та же. Я не понимаю, почему это происходит и даже почему во время выполнения ...
emzero

2
System.Data.SQLite.CoreПакет основан на .NET Ядро (или .NET Standard, я не пошел искать источник или документы). Посмотрите сообщение об ошибке в самом конце файла вашего проекта.
McGuireV10

Почему вы сказали, что он основан на .NET Core? Я смотрю на packages\System.Data.SQLite.Core.1.0.108.0\libкаталог, и он содержит папку для каждой версии .NET Framework, включая 4.6, которую я использую. Я не думаю, что здесь проблема.
emzero

2
Когда я сталкиваюсь с неразрешимыми проблемами, подобными этой, я делаю следующее: 1) внимательно отмечаю, что является ссылкой на проект (или сохраняю где-нибудь .csproj), 2) удаляю файл packages.config, удаляю все внешние ссылки (в качестве альтернативы вы можете написать новый проект с нуля только с исходными статическими файлами, CS и т. д.), 3) настройте VS Nuget для использования ссылки на пакет вместо устаревших пакетов .config mode docs.microsoft.com/en-us/nuget/reference/… и 4) добавить обратно все необходимые ссылки. В большинстве случаев это работает, и я понятия не имею, почему раньше это не удалось.
Саймон Мурье

Ответы:


182

Я думаю, что решение может заключаться в этой проблеме на GitHub :

Попробуйте добавить ссылку на netstandard в web.config следующим образом: "

<system.web>
  <compilation debug="true" targetFramework="4.7.1" >
    <assemblies>
      <add assembly="netstandard, Version=2.0.0.0, Culture=neutral, 
            PublicKeyToken=cc7b13ffcd2ddd51"/>
    </assemblies>
  </compilation>
  <httpRuntime targetFramework="4.7.1" />

Я понимаю, что вы используете 4.6.1, но выбор .NET 4.7.1 имеет большое значение, поскольку более старые версии Framework не полностью совместимы с .NET Standard 2.0.

Я знаю это по болезненному опыту: когда я представил стандартные библиотеки .NET, у меня было много проблем с пакетами NUGET и нарушением ссылок. Другое изменение, которое вам необходимо учитывать, - это обновление до PackageReferences вместо package.configфайлов.

См. Это руководство, и вам также может понадобиться инструмент для обновления . Однако для этого требуется последняя версия VS 15.7.


2
Я думаю, что любой, кто приедет сюда, должен также взглянуть на это отличное руководство по написанию библиотек с открытым исходным кодом от автора Newtonsoft.JSON: docs.microsoft.com/en-us/dotnet/standard/library-guidance/… - в частности, «Избегайте в том числе netstandard1.x»цель, и использование .NET 4.7.2 как самой низкой реальной версии , которая поддерживает .netstandard 2,0
Quango

Именно то, что требовалось при обновлении до v4.7.2 (неосновное приложение) и получило исключение, подобное следующему: «Тип DateTime определен в сборке, на которую нет ссылки. Вы должны добавить ссылку на сборку netstandard, версия = 2.0.0.0, Культура = нейтральный, PublicKeyToken = cc7b13ffcd2ddd51 '.
Ted

Нужно ли это также добавить к ссылкам в файле csproj или это нужно только в web.config?
petrosmm

1
Отличный ответ. Спасибо. Я занимался обновлением старого пакета утилит и поставил на его место новый стандарт 2.0. Это веб-приложение, в частности, имело проблемы, потому что <add assembly="netstandardотсутствовал, а также httpRuntime не был 4.7.1 - Это ответ! Спасибо !!
Петр Кула

В нашем случае у нас было несколько стандартных сборок 2.0, используемых проектом 4.7.2 ASP.Net, но мы добавили некоторый JsonConverter из пространства имен System.Text.Json.Serialization в один из стандартных проектов 2.0, что и вызвало эту ошибку. Это решение решило нашу проблему.
ShaneH

35

У меня сработало ручное редактирование файла .csproj и добавление ссылки ниже.

<Reference Include="netstandard" />

Спасибо Фахаду Альшая, который предложил это здесь .


Куда это поместить в файл проекта? Внутри какой другой «метки»?
Улисс Алвес,

1
@UlyssesAlves Где-то рядом с другими ссылочными тегами
kamilk

@kamilk "где-то рядом с другим" не очень точно. Что ж, я просмотрел некоторые другие проекты, но, к сожалению, у меня это не сработало, и я решил атаковать эту проблему с другой точки зрения, которая не связана с изменением версии проекта .net.
Улисс Алвес,

1
Этот сработал для меня, мне также пришлось установить NetStandard.Library через NuGet.
Дэвид Асеро

Мелочи, которые вас "поймут" ... Отличный ответ.
Бендж Сандерс

15

Мне пришлось сделать комбинацию ответов других людей в этой теме.

  1. Установите NetStandard.Library через NuGet
  2. Редактирование файла .csproj вручную и добавление ссылки. <Reference Include="netstandard" />
  3. Расширение проекта -> Ссылки в обозревателе решений VS, щелкнув правой кнопкой мыши «netstandard» и отобразив страницу свойств и установив для параметра «Копировать локальный» значение true.

3
Настройка «Копировать локально» сделала это за меня.
FrenkyB

1
Это решение отлично работает, к тому же проект не зависит от компиляции в режиме отладки.
DarkHawk

6

Я сталкивался с этим раньше и попытался исправить это для меня:

  • Удалите папку bin, если она существует
  • Удалите скрытую папку .vs
  • Убедитесь, что установлен целевой пакет 4.6.1
  • Последнее усилие: добавьте ссылку на System.Runtime (щелкните правой кнопкой мыши проект -> добавить -> ссылка -> установите флажок рядом с System.Runtime), хотя я думаю, что всегда понимал, что один из вышеперечисленных решений решил это вместо делать это.

Кроме того, если это базовое приложение .net, работающее на полной платформе, я обнаружил, что вам нужно включить файл global.json в корень вашего проекта и указать его на SDK, который вы хотите использовать для этого проекта:

{
  "sdk": {
    "version": "1.0.0-preview2-003121"
  }
}

2
Все перепробовал, не повезло. Как я уже сказал, это не проект .NET Core. Это обычный .NET Framework 4.6.1.
emzero

Закройте VS, удалите bin, удалите .vs - я счастлив.
Рид Шилтс,


5

После обновления 4.6.1 framework до 4.7.2 мы начали получать эту ошибку:

«Тип System.Object определен в сборке, на которую нет ссылки. Вы должны добавить ссылку на сборку netstandard, Version = 2.0.0.0, Culture = нейтральный, PublicKeyToken = cc7b13ffcd2ddd51». и в конечном итоге решением было добавить ссылку на сборку netstandard, упомянутую выше:

<compilation debug="true" targetFramework="4.7.1" >
    <assemblies>
      <add assembly="netstandard, Version=2.0.0.0, Culture=neutral, 
            PublicKeyToken=cc7b13ffcd2ddd51"/>
    </assemblies>
  </compilation>

1
Это работает. Еще одна вещь, которая работает (без этого изменения), - это добавить <Reference Include="netstandard" />в файл csproj, НО ... это работает, только если вы ТАКЖЕ установите для CopyLocal значение true. Все это не имеет смысла.
Трийнко

1

Хотя это старый поток, сегодня у меня была такая же проблема, на прошлой неделе я обновил некоторые пакеты NuGet, и хотя веб-сайт MVC работал нормально на моей машине разработчика, когда я опубликовал на тестовом сервере, он не удался.

Я прочитал множество сообщений, но ни один из них не работал. Наконец, я сравнил DLL в моем локальном бункере с теми, что находятся на тестовом сервере, и обнаружил, что netstandard.dll не был загружен, после загрузки веб-сайт работал нормально, не уверен, почему веб-развертывание VS2017 не опубликовало DLL.

Просто то, на что нужно обратить внимание, если ничего из вышеперечисленного не сработает для вас.


1

Я испытал это при обновлении .NET Core 1.1 до 2.1.

Я следовал инструкциям, изложенным здесь .

Попробуйте удалить <RuntimeFrameworkVersion>1.1.1</RuntimeFrameworkVersion>или <NetStandardImplicitPackageVersion>раздел в .csproj.


1

Мы начали получать эту ошибку на производственном сервере после развертывания приложения, перенесенного с 4.6.1 на 4.7.2.

Мы заметили, что .NET framework 4.7.2 там не установлен. Чтобы решить эту проблему, мы сделали следующие шаги:

  1. Установил .NET Framework 4.7.2 из:

    https://support.microsoft.com/en-us/help/4054530/microsoft-net-framework-4-7-2-offline-installer-for-windows

  2. Перезапустил машину

  3. Подтвердил версию .NET Framework с помощью Как мне найти версию .NET?

Повторный запуск приложения с установленной на компьютере версией .Net Framework 4.7.2 устранил проблему.


1

Я столкнулся с той же проблемой, которую я выполняю после установки приложения, работает нормально

1-

<compilation debug="true" targetFramework="4.7.1">
      <assemblies>
        <add assembly="netstandard, Version=2.0.0.0, Culture=neutral, 
      PublicKeyToken=cc7b13ffcd2ddd51"/>
      </assemblies>
    </compilation>

2- Добавить ссылку

 **C:\Program Files (x86)\Microsoft Visual
Studio\2017\Professional\Common7\IDE\Extensions\Microsoft\ADL
 Tools\2.4.0000.0\ASALocalRun\netstandard.dll**

3-

Copy Above Path Dll to Application Bin Folder on web server


Где это задокументировано? Как кто-нибудь мог бы догадаться поместить эту строку в файл web.config? Между прочим, одинаково хорошо работает добавление в csproj строки, которая ссылается на «netstandard», и установка для CopyLocal значения true. Тем не менее, это даже нигде не указано в качестве возможной ссылки в диалоговом окне ссылок, поэтому единственный способ получить ее - добавить ее вручную. Это безумие. И я нацелен на .NET 4.7.2, который должен быть полностью совместим со стандартом .NET, но мне нужно выполнить эти непонятные шаги, чтобы заставить его работать.
Трийнко

0

Возможно, придется заняться одним из них:

  1. Установите более новый SDK.
  2. В .csproj проверьте наличие ссылки Include = "netstandard"
  3. Проверьте версии сборки в тегах компиляции в файлах Views \ Web.config и Web.config.

хорошо, надеюсь, мы почти у цели. "Я добавил ссылку на NETStandard.Library вместо NETStandard.Library.NETFramework" проверьте это сообщение: github.com/dotnet/standard/issues/391
ivw

Обычно System.Transactions не является частью ваших ссылок, попробуйте добавить его в свои ссылки: щелкните правой кнопкой мыши ссылки, если вы используете веб-приложение, или в своем проекте, если вы используете веб-сайт. найдите System.Transactions в справочниках .NET. Вы должны найти System.Transactions в своих ссылках.
ivw


0

Я столкнулся с этой проблемой при попытке добавить зависимость .NETStandard к библиотеке .NET4.6.1 и компилировать ее в Linux с помощью Mono 4.6.2 (версия, которая поставляется с Ubuntu 16.04).

Я наконец решил это сегодня; решение требует выполнения обоих этих действий:

  1. Измените <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>на <TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>в файле .csproj.
  2. Обновите моно до более новой версии. Я считаю, что 5.x должен работать, но, конечно, вы можете просто установить Ubuntu 20.04 (который на момент написания находится только в предварительной версии), который включает Mono 6.8.0.105.

0

Вы можете добавить в свой web.config свой проект.

Это не сработает, если вы добавите его в проекты web.config, потому что он работает с MVC.


0

В моем случае я обнаружил, что проблемный nuget был System.Memory в версии 4.5.1. при обновлении до версии 4.5.3 работает !!


0

Тем, у кого нет файла web.config. Тип вывода, отличный от веб-приложения. обновите файл проекта (.csproj) приведенным ниже кодом.

Это может быть вызвано неправильным добавлением / удалением .netframework или может неожиданно сломаться.

  <ItemGroup>
    <Reference Include="netstandard" />
  </ItemGroup>

Тип выхода

  • Консольное приложение
  • Библиотека классов

-5

Эта проблема связана с установленной вами версией Visual Studio и Windows, вы можете выполнить следующие действия: -

  1. Перейти в командное окно
  2. понизил ваш PCL с помощью следующей команды

    Install-Package Xamarin.Forms -Version 2.5.1.527436
  3. Восстановите свой проект.
  4. Теперь вы сможете увидеть требуемый результат
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.