Ви повинні додати посилання на 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.