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?


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.


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 .


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

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

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

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>

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.


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


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.


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


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.

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.


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.

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.


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


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

-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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.