261 votes

Vous devez ajouter une référence à l'assemblage "netstandard, Version=2.0.0.0".

Le projet est une application Web ASP.NET MVC utilisant le .NET Framework 4.6.1.

Tout à coup (certains paquets NuGet ont été mis à jour), j'ai commencé à obtenir l'erreur suivante pendant l'exécution :

CS0012 : Le type 'System.Object' est défini dans un assemblage qui n'est pas référencé. référencée. Vous devez ajouter une référence à l'assemblage 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.

A mon avis Index.cshtml dans une ligne où je fais usage de @Html.ActionLink

J'ai installé .NET Core SDK 2.0 et .NET Framework 4.7.1 sur mon ordinateur mais je ne veux pas y faire référence. Il s'agit d'une application web .NET Framework uniquement, elle est hébergée sur Windows IIS où le framework installé est 4.6.1, il n'y a pas de NET Core installé sur le serveur.

Alors pourquoi demande-t-on d'ajouter une référence à netstandard ? Comment puis-je le réparer sans référencer netstandard mais la version complète de Windows .NET Framework 4.6.1 ?

J'ai vérifié un commit précédent qui fonctionnait bien et j'obtiens toujours cette erreur. Ce n'est donc pas lié à la mise à jour des paquets NuGet. Il semble que ce soit quelque chose sur ma machine de développement locale.

Si je publie l'application dans un répertoire et que je l'exécute avec IIS, cela fonctionne.

Lien vers le fichier gist .csproj

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

Lorsque je publie l'application à l'aide de VS2017 sur le système de fichiers, j'obtiens l'avertissement suivant dans la sortie :

L'assemblage suivant dépend d'une version de .NET Framework supérieure à la version cible. Framework supérieure à la cible et risque de ne pas se charger correctement pendant l'exécution, ce qui pourrait provoquer un échec : netstandard, Version=2.0.0.0, Culture=neutre, PublicKeyToken=cc7b13ffcd2ddd51. Les dépendances sont : System.Transactions, Version=4.0.0.0, Culture=neutre, PublicKeyToken=b77a5c561934e089. Vous devez soit vous assurer que l'assemblage assemblage dépendant est correct pour le framework cible, ou bien vous assurer que que le cadre cible auquel vous vous adressez est celui de l'assemblage dépendant. dépendante.

Mais je ne trouve rien sur System.Transactions . Comment puis-je rechercher ce qui y fait référence ?

1 votes

Quels sont les paquets NuGet que vous utilisez ? Êtes-vous sûr de ne pas référencer un paquet ASP.NET Core ?

0 votes

@RicardoPeres VS2017 ne permet pas d'ajouter un package ciblant un framework différent de celui ciblé par le projet. J'ai désinstallé et réinstallé tous les packages mais l'erreur est la même. Je ne comprends pas pourquoi cela se produit et même pourquoi pendant l'exécution....

3 votes

Les System.Data.SQLite.Core est basé sur .NET Core (ou .NET Standard, je n'ai pas cherché la source ou la documentation). Regardez le message d'erreur à la toute fin de votre fichier de projet.

391voto

Quango Points 1098

Je pense que la solution pourrait être ce problème sur GitHub :

Essayez d'ajouter la référence netstandard dans le web.config comme ceci :".

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

Je sais que vous utilisez la version 4.6.1, mais le choix de la version 4.7.1 de .NET est important, car les anciennes versions du Framework ne sont pas entièrement compatibles avec la norme 2.0 de .NET.

Je le sais par expérience douloureuse, lorsque j'ai introduit les bibliothèques standard .NET, j'ai eu beaucoup de problèmes avec les paquets NUGET et les références qui se cassaient. L'autre changement que vous devez considérer est la mise à niveau vers PackageReferences au lieu de package.config des fichiers.

Voir ce guide et vous pourriez aussi vouloir un outil pour aider la mise à niveau . Il nécessite cependant une version tardive de VS 15.7.

8 votes

Je pense que tous ceux qui arrivent ici devraient également consulter cet excellent guide sur l'écriture de librairies open source par l'auteur de Newtonsoft.JSON : learn.microsoft.com/en-us/dotnet/standard/library-guidance/ - en particulier "Éviter d'inclure une cible netstandard1.x", et utiliser .NET 4.7.2 comme la version réelle la plus basse qui supporte .netstandard 2.0

1 votes

Exactement ce dont j'avais besoin lorsque je suis passé à la version 4.7.2 (non core app) et que j'ai obtenu une exception comme la suivante : "Le type 'DateTime' est défini dans un assembly qui n'est pas référencé. Vous devez ajouter une référence à l'assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.

1 votes

Cela doit-il également être ajouté aux références dans le fichier csproj, ou n'est-il nécessaire que dans le fichier web.config ?

84voto

kamilk Points 534

L'édition manuelle du fichier .csproj et l'ajout de la référence ci-dessous ont fonctionné pour moi.

<Reference Include="netstandard" />

Merci à Fahad Alshaya qui l'a suggéré. aquí .

0 votes

Où cela doit-il être placé dans le fichier du projet ? Dans quelle autre "balise" ?

2 votes

@UlyssesAlves Quelque part à côté d'autres étiquettes de référence

2 votes

@kamilk "quelque part à côté d'un autre" n'est pas très précis. J'ai regardé d'autres projets, mais malheureusement cela n'a pas fonctionné pour moi et j'ai décidé d'attaquer ce problème d'un autre point de vue, qui n'implique pas de changer la version .net du projet.

61voto

Damien Sawyer Points 469

J'ai dû faire une combinaison des réponses des autres personnes sur ce fil.

1/ installer la NetStandard.Library via NuGet. 2/ Editer manuellement le fichier .csproj et ajouter la référence

<Reference Include="netstandard" />

3/ Développez le projet-->Références dans l'explorateur de solutions VS, cliquez avec le bouton droit de la souris sur 'netstandard', affichez la page des propriétés et réglez "Copy Local" sur true.

12 votes

L'option "Copier en local" m'a permis d'obtenir ce résultat.

1 votes

Cette solution fonctionne parfaitement, et le projet ne dépend pas de la compilation en mode débogage.

0 votes

Même chose pour moi : application .NET Framework 4.8 qui fait référence à la bibliothèque NetStandard 2.0 via PackageReference (dernier Visual Studio 2019 16.7.7).

8voto

Kyle Dodge Points 511

J'ai déjà rencontré ce problème auparavant et j'ai essayé un certain nombre de choses pour le résoudre :

  • Supprimer un dossier de poubelle s'il existe
  • Supprimez le dossier caché .vs
  • Vérifiez que le pack de ciblage 4.6.1 est installé.
  • Dernier effort : Ajouter une référence à System.Runtime (clic droit sur le projet -> ajouter -> référence -> cocher la case à côté de System.Runtime), bien que je pense que j'ai toujours pensé que l'une des solutions ci-dessus a résolu le problème au lieu de faire cela.

De même, s'il s'agit d'une application .net core fonctionnant avec le framework complet, j'ai constaté que vous devez inclure un fichier global.json à la racine de votre projet et faites-le pointer vers le SDK que vous voulez utiliser pour ce projet :

{
  "sdk": {
    "version": "1.0.0-preview2-003121"
  }
}

3 votes

J'ai tout essayé, sans succès. Il ne s'agit pas d'un projet .NET Core comme je l'ai dit. Il s'agit d'un projet .NET Framework 4.6.1 normal.

0 votes

Fermer VS, supprimer la corbeille, supprimer .vs - je suis content.

4voto

George Phillipson Points 419

Bien qu'il s'agisse d'un vieux fil de discussion, j'ai eu le même problème aujourd'hui. La semaine dernière, j'ai mis à jour certains paquets NuGet et, bien que le site Web MVC ait fonctionné correctement sur ma machine de développement, il a échoué lorsque je l'ai publié sur le serveur de test.

J'ai lu de nombreux articles mais aucun n'a fonctionné. J'ai finalement comparé les DLL de ma corbeille locale à celles du serveur de test et j'ai constaté que la dll netstandard.dll n'était pas téléchargée. Une fois téléchargée, le site Web a fonctionné correctement, mais je ne sais pas pourquoi le déploiement Web de VS2017 n'a pas publié la DLL.

Il s'agit juste d'un élément à prendre en compte au cas où aucune des solutions ci-dessus ne vous conviendrait.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X