Należy dodać odwołanie do zestawu „netstandard, wersja = 2.0.0.0”

124

Projekt jest aplikacją internetową ASP.NET MVC przeznaczoną dla .NET Framework 4.6.1.

Nagle (niektóre pakiety NuGet zostały zaktualizowane) zacząłem otrzymywać następujący błąd w czasie wykonywania:

CS0012: Typ „System.Object” jest zdefiniowany w zestawie, do którego nie ma odniesienia. Należy dodać odwołanie do zestawu „netstandard, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51”.

Moim głównym zdaniem Index.cshtmlw linii, z której korzystam@Html.ActionLink

Mam .NET Core SDK 2.0 i .NET Framework 4.7.1 zainstalowane na moim komputerze, ale nie chcę dołączać do niego odwołania. To jest tylko aplikacja internetowa .NET Framework, jest hostowana w Windows IIS, gdzie zainstalowana struktura to 4.6.1, na serwerze nie ma zainstalowanej platformy NET Core.

Dlaczego więc prosi o dodanie odniesienia do netstandard? Jak mogę to naprawić bez odwoływania się netstandarddo pełnego systemu Windows .NET Framework 4.6.1?

Sprawdziłem poprzednie zatwierdzenie, które działało dobrze i nadal otrzymuję ten błąd. Więc nie jest to związane z uaktualnianiem pakietów NuGet. Wydaje się, że coś jest na moim lokalnym komputerze deweloperskim.

Jeśli opublikujesz aplikację w katalogu i uruchomisz ją z usługami IIS, to działa.

Link do .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>

Podczas publikowania aplikacji za pomocą VS2017 w systemie plików otrzymuję następujące ostrzeżenie:

Następujący zestaw ma zależności od wersji platformy .NET Framework, która jest wyższa niż docelowa i może nie ładować się poprawnie w czasie wykonywania, powodując awarię: netstandard, wersja = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51. Zależności to: System.Transactions, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089. Należy upewnić się, że zestaw zależny jest poprawny dla platformy docelowej lub upewnić się, że platforma docelowa, do której się kierujesz, jest zestawem zależnym.

Ale nic nie mogę znaleźć System.Transactions. Jak mogę wyszukać, do czego się odnosi?

emzero
źródło
1
Jakich pakietów NuGet używasz? Czy na pewno nie odwołujesz się do ASP.NET Core?
Ricardo Peres
@RicardoPeres VS2017 nie pozwala na dodanie pakietu przeznaczonego dla platformy innej niż ta, na którą jest kierowany projekt. Odinstalowałem i ponownie zainstalowałem wszystkie pakiety, ale błąd jest taki sam. Nie rozumiem, dlaczego tak się dzieje, a nawet dlaczego w trakcie działania ...
emzero
2
System.Data.SQLite.CorePakiet bazuje na .NET rdzenia (lub .NET standardu, nie szukać źródła lub docs). Spójrz na komunikat o błędzie na samym końcu pliku projektu.
McGuireV10
Dlaczego powiedziałeś, że jest oparty na upn .NET Core? Patrzę na packages\System.Data.SQLite.Core.1.0.108.0\libkatalog i zawiera folder dla każdej wersji .NET Framework, w tym 4.6, którego używam. Myślę, że nie o to tutaj chodzi.
emzero
2
Kiedy napotykam nierozwiązywalne problemy, takie jak ten, robię to, co robię 1) uważnie zanotuj referencje projektu (lub zapisz gdzieś plik .csproj), 2) usuń plik packages.config, usuń wszystkie odniesienia zewnętrzne (alternatywnie możesz napisać nowy projekt od podstaw tylko z oryginalnymi plikami statycznymi, .cs itp.), 3) skonfiguruj VS Nuget, aby używał odwołania do pakietu zamiast legagy packages.config tryb docs.microsoft.com/en-us/nuget/reference/ ... i 4) dodaj wszystkie potrzebne referencje z powrotem. W większości przypadków działa i nie mam pojęcia, dlaczego wcześniej zawiodło.
Simon Mourier

Odpowiedzi:

181

Myślę, że rozwiązaniem może być ten problem na GitHub :

Spróbuj dodać odwołanie do standardu netstandard w pliku web.config w następujący sposób: "

<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" />

Zdaję sobie sprawę, że używasz wersji 4.6.1, ale wybór platformy .NET 4.7.1 jest istotny, ponieważ starsze wersje platformy Framework nie są w pełni zgodne z .NET Standard 2.0.

Wiem to z bolesnego doświadczenia, kiedy wprowadzałem biblioteki .NET Standard miałem wiele problemów z pakietami NUGET i łamaniem referencji. Inną zmianą, którą musisz wziąć pod uwagę, jest uaktualnienie do PackageReferences zamiast package.configplików.

Zapoznaj się z tym przewodnikiem, a możesz także potrzebować narzędzia ułatwiającego aktualizację . Wymaga jednak późnej wersji VS 15.7.

Quango
źródło
2
Myślę, że każdy, kto tu przyjeżdża, powinien również zapoznać się z doskonałymi wskazówkami dotyczącymi pisania bibliotek open source autorstwa autora Newtonsoft.JSON: docs.microsoft.com/en-us/dotnet/standard/library-guidance/ ... - w szczególności „Unikaj w tym cel netstandard1.x ”i użyj .NET 4.7.2 jako najniższej rzeczywistej wersji obsługującej .netstandard 2.0
Quango
Dokładnie to, co było potrzebne po uaktualnieniu do wersji 4.7.2 (aplikacja inna niż podstawowa) i wystąpił wyjątek podobny do następującego: „Typ„ DateTime ”jest zdefiniowany w zestawie, do którego nie ma odniesienia. Należy dodać odwołanie do zestawu„ netstandard, Version ” = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51 '.
Ted
Czy trzeba to również dodać do odniesień w pliku csproj, czy jest to potrzebne tylko w pliku web.config?
petrosmm,
1
Świetna odpowiedź. Dzięki. Byłem w trakcie uaktualniania starego pakietu narzędzi i zamiast niego wprowadziłem nowy standard 2.0. W szczególności ta aplikacja internetowa miała problemy, ponieważ <add assembly="netstandardbrakowało jej, a także httpRuntime nie było 4.7.1 - To jest odpowiedź! Dzięki !!
Piotr Kula
W naszym przypadku mieliśmy kilka standardowych zestawów 2.0 używanych przez projekt 4.7.2 ASP.Net, ale dodaliśmy trochę JsonConverter z przestrzeni nazw System.Text.Json.Serialization do jednego ze standardowych projektów 2.0 i to spowodowało ten błąd. To rozwiązanie rozwiązało nasz problem.
ShaneH
35

Ręczna edycja pliku .csproj i dodanie poniższego odniesienia zadziałało.

<Reference Include="netstandard" />

Dziękuję Fahadowi Alshayi, który zasugerował to tutaj .

kamilk
źródło
Gdzie należy to umieścić w pliku projektu? W jakim innym „tagu”?
Ulysses Alves
1
@UlyssesAlves Somewhere next to other Reference tags
kamilk
@kamilk „gdzieś obok innego” nie jest zbyt dokładne. Cóż, przyjrzałem się innym projektom, ale niestety to nie zadziałało i postanowiłem zaatakować ten problem z innej perspektywy, która nie wymaga zmiany wersji projektu .net.
Ulysses Alves
1
Ten działał dla mnie, musiałem również zainstalować NetStandard.Library przez NuGet.
David Acero
Małe rzeczy, które cię „dopadają” ... Świetna odpowiedź.
Benj Sanders
15

Musiałem zrobić kombinację odpowiedzi innych osób w tym wątku.

  1. Zainstaluj NetStandard.Library za pośrednictwem NuGet
  2. Ręczna edycja pliku .csproj i dodanie odwołania. <Reference Include="netstandard" />
  3. Rozwijanie projektu -> Referencje w VS Solution Explorer, kliknięcie prawym przyciskiem myszy „netstandard” i wyświetlenie strony właściwości oraz ustawienie „Copy Local” na true.
Damien Sawyer
źródło
3
Ustawienie „Kopiuj lokalnie” zrobiło to za mnie.
FrenkyB
1
To rozwiązanie działa doskonale, a projekt nie jest zależny od kompilacji w trybie debugowania.
DarkHawk
6

Spotkałem się z tym już wcześniej i wypróbowanie kilku rzeczy naprawiło to dla mnie:

  • Usuń folder kosza, jeśli istnieje
  • Usuń ukryty folder .vs
  • Upewnij się, że pakiet docelowy 4.6.1 jest zainstalowany
  • Last Ditch Effort: Dodaj odniesienie do System.Runtime (kliknij prawym przyciskiem myszy projekt -> dodaj -> odniesienie -> zaznacz pole obok System.Runtime), chociaż wydaje mi się, że zawsze rozumiałem, że jeden z powyższych rozwiązał go robienia tego.

Ponadto, jeśli jest to aplikacja .net core działająca w pełnym środowisku, odkryłem, że musisz dołączyć plik global.json w katalogu głównym projektu i wskazać SDK, którego chcesz użyć dla tego projektu:

{
  "sdk": {
    "version": "1.0.0-preview2-003121"
  }
}
Kyle Dodge
źródło
2
Próbowałem wszystkich, bez powodzenia. To nie jest projekt .NET Core, jak powiedziałem. To jest normalny .NET Framework 4.6.1.
emzero
Zamknij VS, usuń kosz, usuń .vs - cieszę się.
Reed Shilts
5

Usuwanie folderów Bin i Obj działało dla mnie.

Vijay Verma
źródło
5

Po aktualizacji z 4.6.1 framework do 4.7.2 zaczęliśmy otrzymywać ten błąd:

„Typ„ System.Object ”jest zdefiniowany w zestawie, do którego nie ma odniesienia. Należy dodać odwołanie do zestawu„ netstandard, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51 ”. Ostatecznie rozwiązaniem było dodanie wspomnianego powyżej odniesienia do zespołu „netstandard”:

<compilation debug="true" targetFramework="4.7.1" >
    <assemblies>
      <add assembly="netstandard, Version=2.0.0.0, Culture=neutral, 
            PublicKeyToken=cc7b13ffcd2ddd51"/>
    </assemblies>
  </compilation>
Raghav
źródło
1
To działa. Inną rzeczą, która działa (bez tej zmiany) jest dodanie the <Reference Include="netstandard" />do pliku csproj, ALE ... to działa tylko wtedy, gdy RÓWNIEŻ ustawisz CopyLocal na true. Nic z tego nie ma sensu.
Triynko
1

Chociaż jest to stary wątek, miałem ten sam problem dzisiaj, w zeszłym tygodniu zaktualizowałem niektóre pakiety NuGet i chociaż witryna MVC działała dobrze na mojej maszynie deweloperskiej, kiedy publikowałem na serwerze testowym, nie udało się.

Czytałem liczne posty, ale żaden nie działał. W końcu porównałem biblioteki DLL w moim lokalnym koszu z tymi na serwerze testowym i stwierdziłem, że plik netstandard.dll nie został przesłany, po załadowaniu witryna działała poprawnie, nie jestem pewien, dlaczego wdrożenie internetowe VS2017 nie opublikowało biblioteki DLL.

Po prostu coś, na co należy zwrócić uwagę na wypadek, gdyby żadna z powyższych nie zadziałała.

George Phillipson
źródło
1

Doświadczyłem tego podczas uaktualniania .NET Core 1.1 do 2.1.

Postępowałem zgodnie z instrukcjami przedstawionymi tutaj .

Spróbuj usunąć <RuntimeFrameworkVersion>1.1.1</RuntimeFrameworkVersion>lub <NetStandardImplicitPackageVersion>sekcję w .csproj.

h-rai
źródło
1

Zaczęliśmy otrzymywać ten błąd na serwerze produkcyjnym po wdrożeniu aplikacji po migracji z wersji 4.6.1 do 4.7.2.

Zauważyliśmy, że nie zainstalowano tam platformy .NET Framework 4.7.2. Aby rozwiązać ten problem, wykonaliśmy następujące kroki:

  1. Zainstalowano .NET Framework 4.7.2 z:

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

  2. Zrestartowałem maszynę

  3. Potwierdzono wersję .NET Framework z pomocą Jak znaleźć wersję .NET?

Ponowne uruchomienie aplikacji z wersją .Net Framework 4.7.2 zainstalowaną na komputerze rozwiązało problem.

Raghav
źródło
1

Stoję w obliczu tego samego problemu, który wykonuję zgodnie z procedurą Setup Now Aplikacja działa dobrze

1-

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

2- Dodaj odniesienie

 **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

Mansoor
źródło
Gdzie to jest udokumentowane? Jak ktokolwiek zgadłby umieścić tę linię w pliku web.config? Nawiasem mówiąc, równie dobrze działa dodanie linii do csproj, która odwołuje się do „netstandard”, i ustawienie CopyLocal na true. Mimo to nie jest to nawet wymienione jako możliwe odniesienie w oknie dialogowym odwołań, więc jedynym sposobem, aby to uzyskać, jest dodanie go ręcznie. To jest szalone. I zamierzam .NET 4.7.2, który powinien być w pełni zgodny ze standardem .NET, ale muszę wykonać te niejasne kroki, aby to zadziałało.
Triynko
0

Może trzeba będzie wykonać jedną z tych czynności:

  1. Zainstaluj nowszy pakiet SDK.
  2. W .csproj sprawdź odwołanie Include = "netstandard"
  3. Sprawdź wersje zestawu w tagach kompilacji w plikach Views \ Web.config i Web.config.
ivw
źródło
ok, miejmy nadzieję, że prawie jesteśmy na miejscu. ”Dodałem odniesienie do NETStandard.Library zamiast NETStandard.Library.NETFramework”, sprawdź ten post: github.com/dotnet/standard/issues/391
ivw
Zwykle System.Transactions nie jest częścią twoich referencji, spróbuj dodać je do swoich referencji: kliknij prawym przyciskiem myszy swoje referencje, jeśli korzystasz z aplikacji internetowej lub w swoim projekcie, jeśli korzystasz z witryny sieci Web. znajdź System.Transactions w odwołaniach .NET. W swoich referencjach powinieneś znaleźć System.Transactions.
ivw
0

wprowadź opis obrazu tutaj Ustaw Copy Enbale na true we właściwościach netstandard.dll.

Otwórz Eksplorator rozwiązań i kliknij prawym przyciskiem myszy plik netstandard.dll. Ustaw Copy Local na true.

hani abukhurma
źródło
0

Miałem do czynienia z tym problemem, gdy próbowałem dodać zależność .NETStandard do biblioteki .NET4.6.1 i kompilować ją w systemie Linux z Mono 4.6.2 (wersja dostarczana z Ubuntu 16.04).

W końcu rozwiązałem to dzisiaj; rozwiązanie wymaga obu tych rzeczy:

  1. Zmień <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>na <TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>w pliku .csproj.
  2. Uaktualnij swoje mono do nowszej wersji. Uważam, że 5.x powinien działać, ale dla pewności możesz po prostu zainstalować Ubuntu 20.04 (który w momencie pisania jest tylko w wersji zapoznawczej), który zawiera Mono 6.8.0.105.
knocte
źródło
0

Możesz dodać do swojego web.config w swoim projekcie.

Nie zadziała, jeśli dodasz go do projektu web.config, ponieważ działa z MVC.

MEO
źródło
0

W moim przypadku okazało się, że problematyczny nuget to System.Memory w wersji 4.5.1. po aktualizacji do wersji 4.5.3 działa !!

bk
źródło
0

Ci, którzy nie mają pliku web.config. Typ danych wyjściowych inny niż aplikacja internetowa. zaktualizuj plik projektu (.csproj) za pomocą poniższego kodu.

Może to być spowodowane dodaniem / usunięciem .netframework w niewłaściwy sposób lub może zepsuć się w nieoczekiwany sposób.

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

Typ wyjścia

  • Aplikacja konsoli
  • Biblioteka klas
Thiya
źródło
-5

Ten problem jest oparty na zainstalowanej wersji programu Visual Studio i systemu Windows. Możesz wykonać następujące czynności: -

  1. Przejdź do okna poleceń
  2. obniżył wersję PCL za pomocą następującego polecenia

    Install-Package Xamarin.Forms -Version 2.5.1.527436
  3. Odbuduj swój projekt.
  4. Teraz będziesz mógł zobaczyć wymagane wyjście
Rakendu Shukla
źródło