Sie müssen einen Verweis auf den Netzstandard der Assembly, Version = 2.0.0.0, hinzufügen

122

Das Projekt ist eine ASP.NET MVC-Webanwendung für .NET Framework 4.6.1.

Plötzlich (einige NuGet-Pakete wurden aktualisiert) wurde zur Laufzeit der folgende Fehler angezeigt:

CS0012: Der Typ 'System.Object' wird in einer Assembly definiert, auf die nicht verwiesen wird. Sie müssen einen Verweis auf die Assembly 'netstandard, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51' hinzufügen.

In meiner Hauptansicht Index.cshtmlin einer Zeile, in der ich Gebrauch mache@Html.ActionLink

Ich habe .NET Core SDK 2.0 und .NET Framework 4.7.1 auf meinem Computer installiert, möchte aber keinen Verweis darauf einfügen. Dies ist nur eine .NET Framework-Webanwendung. Sie wird unter Windows IIS gehostet, wo das installierte Framework 4.6.1 ist. Auf dem Server ist kein NET Core installiert.

Warum wird darum gebeten, einen Verweis auf hinzuzufügen netstandard? Wie kann ich das Problem beheben, ohne auf netstandardWindows .NET Framework 4.6.1 zu verweisen ?

Ich habe ein vorheriges Commit ausgecheckt, das gut funktioniert hat, und ich erhalte immer noch diesen Fehler. Es hängt also nicht mit NuGet-Paketen zusammen, die aktualisiert werden. Scheint etwas auf meiner lokalen Entwicklungsmaschine zu sein.

Wenn Sie die App in einem Verzeichnis veröffentlichen und mit IIS ausführen, funktioniert sie.

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

Beim Veröffentlichen der App mit VS2017 im Dateisystem wird in der Ausgabe die folgende Warnung angezeigt:

Die folgende Assembly hat Abhängigkeiten von einer Version von .NET Framework, die höher als das Ziel ist und zur Laufzeit möglicherweise nicht korrekt geladen wird und einen Fehler verursacht: netstandard, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51. Die Abhängigkeiten sind: System.Transactions, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089. Sie sollten entweder sicherstellen, dass die abhängige Assembly für das Zielframework korrekt ist, oder sicherstellen, dass das Zielframework, das Sie ansprechen, das der abhängigen Assembly ist.

Aber ich kann nichts finden System.Transactions. Wie kann ich suchen, worauf es verweist?

Emzero
quelle
1
Welche NuGet-Pakete verwenden Sie? Sind Sie sicher, dass Sie nicht auf einen ASP.NET Core verweisen?
Ricardo Peres
Mit @RicardoPeres VS2017 können Sie kein Paket hinzufügen, das auf ein anderes Framework abzielt als das, auf das das Projekt abzielt. Ich habe alle Pakete deinstalliert und neu installiert, aber der Fehler ist der gleiche. Ich verstehe nicht, warum es passiert und warum zur Laufzeit ...
Emzero
2
Das System.Data.SQLite.CorePaket basiert auf .NET Core (oder .NET Standard, ich habe nicht nach der Quelle oder den Dokumenten gesucht). Sehen Sie sich die Fehlermeldung ganz am Ende Ihrer Projektdatei an.
McGuireV10
Warum basiert Ihrer Meinung nach auf .NET Core? Ich schaue mir das packages\System.Data.SQLite.Core.1.0.108.0\libVerzeichnis an und es enthält einen Ordner für jede Version von .NET Framework, einschließlich 4.6, das ich verwende. Ich denke nicht, dass das hier das Problem ist.
Emzero
2
Wenn ich auf unlösbare Probleme wie dieses stoße, notiere ich 1) sorgfältig die Referenz des Projekts (oder speichere die .csproj irgendwo), 2) entferne die Datei packages.config, entferne alle externen Referenzen (alternativ kannst du ein neues Projekt schreiben von Grund auf nur mit den ursprünglichen statischen Dateien, .cs usw.), 3) Konfigurieren Sie VS Nuget so, dass die Paketreferenz anstelle des legagy packages.config-Modus verwendet wird. docs.microsoft.com/en-us/nuget/reference/… und 4) Fügen Sie alle benötigten Referenzen wieder hinzu. Meistens funktioniert es und ich habe keine Ahnung, warum es vorher fehlgeschlagen ist.
Simon Mourier

Antworten:

179

Ich denke, die Lösung könnte dieses Problem auf GitHub sein :

Versuchen Sie, eine netstandard-Referenz in web.config wie folgt hinzuzufügen: "

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

Mir ist klar, dass Sie 4.6.1 verwenden, aber die Wahl von .NET 4.7.1 ist wichtig, da ältere Framework-Versionen nicht vollständig mit .NET Standard 2.0 kompatibel sind.

Ich weiß dies aus schmerzhafter Erfahrung, als ich .NET Standard-Bibliotheken einführte, hatte ich viele Probleme mit NUGET-Paketen und Referenzbrüchen. Die andere Änderung, die Sie berücksichtigen müssen, ist das Upgrade auf PackageReferences anstelle von package.configDateien.

In diesem Handbuch finden Sie möglicherweise auch ein Tool, das Sie beim Upgrade unterstützt . Es ist jedoch eine späte VS 15.7-Version erforderlich.

Quango
quelle
2
Ich denke, jeder, der hier ankommt, sollte sich auch diese hervorragende Anleitung zum Schreiben von Open-Source-Bibliotheken des Autors von Newtonsoft ansehen. JSON: docs.microsoft.com/en-us/dotnet/standard/library-guidance/… - insbesondere "Vermeiden einschließlich eines netstandard1.x "-Ziels und verwenden Sie .NET 4.7.2 als niedrigste reale Version, die .netstandard 2.0 unterstützt
Quango
Genau das, was beim Upgrade auf Version 4.7.2 (Nicht-Core-App) benötigt wurde und eine Ausnahme wie die folgende aufwies: "Der Typ 'DateTime' ist in einer Assembly definiert, auf die nicht verwiesen wird. Sie müssen einen Verweis auf Assembly 'netstandard, Version hinzufügen = 2.0.0.0, Kultur = neutral, PublicKeyToken = cc7b13ffcd2ddd51 '.
Ted
Muss dies auch zu den Referenzen in der csproj-Datei hinzugefügt werden oder wird es nur in der web.config benötigt?
Petrosmm
1
Gute Antwort. Vielen Dank. Ich war dabei, ein altes Dienstprogrammpaket zu aktualisieren und stattdessen einen neuen Standard 2.0 zu verwenden. Diese Web-App hatte insbesondere Probleme, weil die <add assembly="netstandardfehlte und auch httpRuntime nicht 4.7.1- Dies ist die Antwort! Vielen Dank !!
Piotr Kula
In unserem Fall hatten wir mehrere Standard 2.0-Assemblys, die von einem 4.7.2 ASP.Net-Projekt verwendet wurden, aber wir haben einem der Standard 2.0-Projekte einige JsonConverter aus dem System.Text.Json.Serialization-Namespace hinzugefügt, was diesen Fehler verursachte. Diese Lösung hat unser Problem behoben.
ShaneH
34

Das manuelle Bearbeiten der .csproj-Datei und das Hinzufügen der folgenden Referenz hat bei mir funktioniert.

<Reference Include="netstandard" />

Vielen Dank an Fahad Alshaya, der es hier vorgeschlagen hat .

Kamilk
quelle
Wo soll dies in die Projektdatei eingefügt werden? In welchem ​​anderen "Tag"?
Ulysses Alves
1
@UlyssesAlves Irgendwo neben anderen Referenz-Tags
Kamilk
@kamilk "irgendwo neben einem anderen" ist nicht sehr genau. Nun, ich habe mir einige andere Projekte angesehen, aber leider hat dies bei mir nicht funktioniert und ich habe beschlossen, dieses Problem aus einer anderen Perspektive anzugreifen, ohne die .net-Version des Projekts zu ändern.
Ulysses Alves
1
Dieser hat bei mir funktioniert, ich musste auch die NetStandard.Library über NuGet installieren.
David Acero
Die kleinen Dinge, die dich "erwischen" ... Tolle Antwort.
Benj Sanders
15

Ich musste eine Kombination der Antworten anderer Leute auf diesen Thread machen.

  1. Installieren Sie die NetStandard.Library über NuGet
  2. Manuelles Bearbeiten der .csproj-Datei und Hinzufügen der Referenz. <Reference Include="netstandard" />
  3. Projekt erweitern -> Verweise im VS-Projektmappen-Explorer, klicken Sie mit der rechten Maustaste auf "Netzstandard", zeigen Sie die Eigenschaftenseite an und setzen Sie "Lokal kopieren" auf "true".
Damien Sawyer
quelle
3
Die Einstellung 'Lokal kopieren' hat es für mich getan.
FrenkyB
1
Diese Lösung funktioniert einwandfrei und das Projekt hängt nicht vom Kompilieren im Debug-Modus ab.
DarkHawk
6

Ich bin schon einmal darauf gestoßen, und das Ausprobieren einer Reihe von Dingen hat es für mich behoben:

  • Löschen Sie einen Bin-Ordner, falls vorhanden
  • Löschen Sie den versteckten .vs-Ordner
  • Stellen Sie sicher, dass das 4.6.1 Targeting Pack installiert ist
  • Letzter Grabenaufwand: Fügen Sie einen Verweis auf System.Runtime hinzu (klicken Sie mit der rechten Maustaste auf Projekt -> Hinzufügen -> Verweis -> aktivieren Sie das Kontrollkästchen neben System.Runtime), obwohl ich immer herausgefunden habe, dass einer der oben genannten Punkte ihn stattdessen gelöst hat dies zu tun.

Wenn es sich um eine .net-Kernanwendung handelt, die auf dem vollständigen Framework ausgeführt wird, müssen Sie eine global.json- Datei im Stammverzeichnis Ihres Projekts einfügen und auf das SDK verweisen, das Sie für dieses Projekt verwenden möchten:

{
  "sdk": {
    "version": "1.0.0-preview2-003121"
  }
}
Kyle Dodge
quelle
2
Versuchte alles, kein Glück. Dies ist kein .NET Core-Projekt, wie ich bereits sagte. Dies ist ein normales .NET Framework 4.6.1.
Emzero
VS schließen, bin löschen, .vs löschen - ich bin glücklich.
Reed Shilts vor
5

Das Löschen der Ordner Bin und Obj hat bei mir funktioniert.

Vijay Verma
quelle
5

Nach dem Upgrade von 4.6.1 Framework auf 4.7.2 wurde der folgende Fehler angezeigt:

"Der Typ 'System.Object' ist in einer Assembly definiert, auf die nicht verwiesen wird. Sie müssen einen Verweis auf Assembly 'netstandard, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51' hinzufügen." und letztendlich bestand die Lösung darin, die oben erwähnte "netstandard" -Baugruppenreferenz hinzuzufügen:

<compilation debug="true" targetFramework="4.7.1" >
    <assemblies>
      <add assembly="netstandard, Version=2.0.0.0, Culture=neutral, 
            PublicKeyToken=cc7b13ffcd2ddd51"/>
    </assemblies>
  </compilation>
Raghav
quelle
1
Das funktioniert. Eine andere Sache, die funktioniert (ohne diese Änderung), ist das Hinzufügen <Reference Include="netstandard" />von zur csproj-Datei, ABER ... das funktioniert nur, wenn Sie AUCH CopyLocal auf true setzen. Nichts davon macht Sinn.
Triynko
1

Obwohl dies ein alter Thread ist, hatte ich heute das gleiche Problem. Letzte Woche habe ich einige NuGet-Pakete aktualisiert und obwohl die MVC-Website auf meinem Entwicklungscomputer einwandfrei funktioniert hat, als ich sie auf dem Testserver veröffentlicht habe, ist sie fehlgeschlagen.

Ich habe zahlreiche Beiträge gelesen, aber keiner hat funktioniert. Ich habe schließlich die DLLs in meinem lokalen Bin mit denen auf dem Testserver verglichen und festgestellt, dass die netstandard.dll nicht hochgeladen wurde. Nach dem Hochladen funktionierte die Website einwandfrei. Ich bin mir nicht sicher, warum VS2017 Web Deploy die DLL nicht veröffentlicht hat.

Nur etwas, worauf Sie achten sollten, falls keines der oben genannten Verfahren für Sie funktioniert.

George Phillipson
quelle
1

Ich habe dies beim Upgrade von .NET Core 1.1 auf 2.1 erlebt.

Ich folgte den Anweisungen skizzierte hier .

Versuchen Sie, die .csproj-Datei zu entfernen <RuntimeFrameworkVersion>1.1.1</RuntimeFrameworkVersion>oder zu entfernen <NetStandardImplicitPackageVersion>.

h-rai
quelle
1

Nach der Bereitstellung der von 4.6.1 auf 4.7.2 migrierten Anwendung wurde dieser Fehler auf dem Produktionsserver angezeigt.

Wir haben festgestellt, dass das .NET Framework 4.7.2 dort nicht installiert wurde. Um dieses Problem zu lösen, haben wir die folgenden Schritte ausgeführt:

  1. Installierte .NET Framework 4.7.2 von:

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

  2. Starten Sie die Maschine neu

  3. Bestätigte die .NET Framework-Version mit Hilfe von Wie finde ich die .NET-Version?

Durch erneutes Ausführen der Anwendung mit der auf dem Computer installierten .NET Framework 4.7.2-Version wurde das Problem behoben.

Raghav
quelle
1

Ich stehe vor dem gleichen Problem, das ich nach Setup Now Application habe

1-

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

2- Referenz hinzufügen

 **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
quelle
Wo ist das dokumentiert? Wie würde jemand raten, diese Zeile in eine web.config-Datei einzufügen? Übrigens funktioniert es genauso gut, dem csproj eine Zeile hinzuzufügen, die auf "netstandard" verweist, und CopyLocal auf true zu setzen. Trotzdem wird dies nirgendwo im Referenzdialog als mögliche Referenz aufgeführt. Der einzige Weg, um es zu erhalten, besteht darin, es manuell hinzuzufügen. Das ist verrückt. Und ich ziele auf .NET 4.7.2 ab, das vollständig mit dem .NET-Standard kompatibel sein soll, aber ich muss diese undurchsichtigen Schritte ausführen, damit es funktioniert.
Triynko
0

Könnte mit einem dieser Dinge zu tun haben:

  1. Installieren Sie ein neueres SDK.
  2. Suchen Sie in .csproj nach Referenz Include = "netstandard"
  3. Überprüfen Sie die Assemblyversionen in den Kompilierungs-Tags in Views \ Web.config und Web.config.
ivw
quelle
ok, hoffentlich sind wir fast da. "Ich habe den Verweis auf NETStandard.Library anstelle von NETStandard.Library.NETFramework hinzugefügt." Überprüfen Sie diesen Beitrag: github.com/dotnet/standard/issues/391
ivw
Normalerweise ist System.Transactions nicht Teil Ihrer Referenzen. Versuchen Sie, es in Ihre Referenzen aufzunehmen, indem Sie: mit der rechten Maustaste auf Ihre Referenzen klicken, wenn Sie eine Webanwendung verwenden, oder in Ihrem Projekt, wenn Sie eine Website verwenden. Suchen Sie die System.Transactions in den .NET-Referenzen. Sie sollten die System.Transactions in Ihren Referenzen finden.
ivw
0

Geben Sie hier die Bildbeschreibung ein. Setzen Sie Copy Enbale in den Eigenschaften netstandard.dll auf true.

Öffnen Sie den Projektmappen-Explorer und klicken Sie mit der rechten Maustaste auf netstandard.dll. Setzen Sie Copy Local auf true.

hani abukhurma
quelle
0

Dieses Problem trat auf, als ich versuchte, einer .NET4.6.1-Bibliothek eine .NETStandard-Abhängigkeit hinzuzufügen und diese unter Linux mit Mono 4.6.2 (der mit Ubuntu 16.04 gelieferten Version) zu kompilieren.

Ich habe es heute endlich gelöst; Die Lösung erfordert beides:

  1. Ändern <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>zu <TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>in der CSPROJ Datei.
  2. Aktualisieren Sie Ihr Mono auf eine neuere Version. Ich glaube, 5.x sollte funktionieren, aber um sicher zu sein, können Sie einfach Ubuntu 20.04 installieren (das zum Zeitpunkt des Schreibens nur in der Vorschau angezeigt wird), das Mono 6.8.0.105 enthält.
knocte
quelle
0

Sie können Ihrer web.config in Ihrem Projekt hinzufügen.

Es würde nicht funktionieren, wenn Sie es zu Projekten web.config hinzufügen, da es mit MVC funktioniert.

MEO
quelle
0

In meinem Fall fand ich heraus, dass das problematische Nuget System.Memory in Version 4.5.1 war. Wenn es auf Version 4.5.3 aktualisiert wird, funktioniert es !!

bk
quelle
0

Diejenigen, die keine web.config-Datei haben. Ausgabetyp außer Webanwendung. Aktualisieren Sie die Projektdatei (.csproj) mit dem folgenden Code.

Dies kann dazu führen, dass das .netframework nicht ordnungsgemäß hinzugefügt / entfernt wird, oder es kann auf unerwartete Weise beschädigt werden.

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

Ausgabetyp

  • Konsolenanwendung
  • Klassenbibliothek
Thiya
quelle
-5

Dieses Problem basiert auf Ihrer installierten Version von Visual Studio und Windows. Sie können die folgenden Schritte ausführen: -

  1. Gehen Sie zum Befehlsfenster
  2. Herabstufung Ihrer PCL mit dem folgenden Befehl

    Install-Package Xamarin.Forms -Version 2.5.1.527436
  3. Erstellen Sie Ihr Projekt neu.
  4. Jetzt können Sie die gewünschte Ausgabe sehen
Rakendu Shukla
quelle