Ви повинні додати посилання на netstandard збірки, Версія = 2.0.0.0


124

Проект є веб-додатком ASP.NET MVC, орієнтованим на .NET Framework 4.6.1.

Раптом (деякі пакети NuGet було оновлено) я почав отримувати таку помилку під час виконання:

CS0012: Тип 'System.Object' визначений у складі, на який не посилається. Ви повинні додати посилання на збірку 'netstandard, Версія = 2.0.0.0, Культура = нейтральна, 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

пакети.конфіг

<?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, Версія = 2.0.0.0, Культура = нейтральна, PublicKeyToken = cc7b13ffcd2ddd51. Залежності: System.Transaction, Версія = 4.0.0.0, Культура = нейтральна, PublicKeyToken = b77a5c561934e089. Вам слід або переконатися, що залежна збірка є правильною для цільової рамки, або переконатися, що цільова рамка, до якої ви звертаєтесь, є залежною збіркою.

Але я нічого не можу знайти System.Transactions. Як я можу шукати, на що це посилається?


1
Які пакети NuGet ви використовуєте? Ви впевнені, що не посилаєтесь на ASP.NET Core?
Рікардо Перес

@RicardoPeres VS2017 не дозволяє додавати пакет, орієнтований на рамки, які відрізняються від того, на який спрямований проект. Я видалив і перевстановив усі пакети, але помилка однакова. Я не розумію, чому це відбувається і навіть чому під час виконання ...
emzero

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

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

2
Коли я стикаюся з нерозв'язними такими проблемами, що я роблю, це 1) ретельно зазначте, що є посиланням проекту (або збережіть .csproj кудись), 2) видаліть файл Packa.config, видаліть усі зовнішні посилання (або ви можете написати новий проект з нуля лише з оригінальними статичними файлами, .cs і т. д.), 3) налаштувати VS Nuget для використання довідкового пакета замість легальних пакетів. режиму docs.microsoft.com/en-us/nuget/reference/… та 4) додати всі необхідні посилання назад. Більшу частину часу це працює, і я не маю поняття, чому це раніше не вдалося.
Саймон Мур’є

Відповіді:


181

Я думаю, що рішенням цієї проблеми на 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 Standard, у мене було багато проблем з порушенням пакетів і посилань 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 '.
Тед

Це також потрібно додавати до посилань у файлі 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 Solution, клацнувши правою кнопкою миші на 'netstandard' та показавши сторінку властивостей та встановивши "Копіювати локальне" на true.

3
Налаштування "Копіювати місцеве" зробило це для мене.
FrenkyB

1
Це рішення працює чудово, плюс проект не залежить від компіляції в режимі налагодження.
DarkHawk

6

Я раніше стикався з цим, і спробувавши ряд речей, це вирішило для мене:

  • Видаліть папку для сміття, якщо вона існує
  • Видаліть приховану папку .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, видалити контейнер, видалити .vs - я щасливий.
Рід Шильц


5

Після оновлення з 4.6.1 фреймворка до 4.7.2 ми почали отримувати цю помилку:

"Тип 'System.Object' визначений у збірці, на яку не посилається. Ви повинні додати посилання на збірку 'netstandard, Версія = 2.0.0.0, Культура = нейтральна, 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 на істинне. Ніщо з цього не має сенсу.
Трайнко

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/isissue/391
ivw

Зазвичай System.Transaction не є частиною ваших посилань, спробуйте додати його у свої посилання: знайдіть System.Transaction у посиланнях .NET. Ви повинні знайти System.Transaction у своїх посиланнях.
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

У моєму випадку я з'ясував, що проблемним завданням був System.Memory у версії 4.5.1. коли оновлено до версії 4.5.3, це працює !!


0

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

Це може спричинитись через додавання / видалення .netframework неналежним чином, або може зламатися несподівано.

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

Тип виходу

  • Застосування консолі
  • Класна бібліотека

-5

Ця проблема заснована на встановленій версії візуальної студії та Windows, ви можете виконати наступні кроки: -

  1. Перейдіть у вікно команд
  2. знизили ваш ПКЛ за допомогою наступної команди

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