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

124

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

Tout à coup (certains packages NuGet ont été mis à niveau), j'ai commencé à recevoir l'erreur suivante pendant l'exécution:

CS0012: Le type 'System.Object' 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'.

Dans ma vision principale Index.cshtml, dans une ligne où j'utilise@Html.ActionLink

J'ai .NET Core SDK 2.0 et .NET Framework 4.7.1 installés sur ma machine mais je ne souhaite pas y inclure de 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, aucun NET Core n'est installé sur le serveur.

Alors pourquoi demande-t-il d'ajouter une référence à netstandard? Comment puis-je résoudre ce problème sans faire référence à netstandardla 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é aux packages NuGet en cours de mise à niveau. Semble être quelque chose sur ma machine de développement locale.

Si vous publiez l'application dans un répertoire et l'exécutez avec IIS, cela fonctionne.

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

Lors de la publication de l'application à l'aide de VS2017 sur le système de fichiers, je reçois l'avertissement suivant dans la sortie:

L'assembly suivant a des dépendances sur une version du .NET Framework qui est supérieure à la cible et peut ne pas se charger correctement pendant l'exécution, provoquant un échec: netstandard, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51. Les dépendances sont: System.Transactions, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089. Vous devez soit vous assurer que l'assembly dépendant est correct pour l'infrastructure cible, soit vous assurer que l'infrastructure cible que vous adressez est celle de l'assembly dépendant.

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

emzero
la source
1
Quels packages NuGet utilisez-vous? Êtes-vous sûr de ne pas référencer un ASP.NET Core?
Ricardo Peres le
@RicardoPeres VS2017 ne vous permet pas d'ajouter un package ciblant un framework différent de celui que le projet cible. 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 ...
emzero
2
Le System.Data.SQLite.Corepackage est basé sur .NET Core (ou .NET Standard, je n'ai pas cherché la source ou les documents). Regardez le message d'erreur à la toute fin de votre fichier projet.
McGuireV10
Pourquoi dites-vous qu'il est basé sur .NET Core? Je regarde le packages\System.Data.SQLite.Core.1.0.108.0\librépertoire et il contient un dossier pour chaque version du .NET Framework, y compris 4.6 qui est ce que j'utilise. Je ne pense pas que ce soit le problème ici.
emzero
2
Lorsque je suis confronté à des problèmes insolubles comme celui-ci, ce que je fais, c'est 1) noter attentivement la référence du projet (ou enregistrer le .csproj quelque part), 2) supprimer le fichier packages.config, supprimer toutes les références externes (vous pouvez également écrire un nouveau projet à partir de zéro uniquement avec les fichiers statiques d'origine, .cs, etc.), 3) configurer VS Nuget pour utiliser la référence de package au lieu du mode packages.config hérité docs.microsoft.com/en-us/nuget/reference / ... et 4) ajoutez toutes les références nécessaires. La plupart du temps, cela fonctionne et je n'ai aucune idée de pourquoi cela a échoué auparavant.
Simon Mourier

Réponses:

181

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

Essayez d'ajouter une référence netstandard dans 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 4.6.1 mais le choix de .NET 4.7.1 est important car les anciennes versions du Framework ne sont pas entièrement compatibles avec .NET Standard 2.0.

Je le sais par expérience douloureuse, lorsque j'ai introduit les bibliothèques .NET Standard, j'ai eu beaucoup de problèmes avec les packages NUGET et la rupture de références. L'autre changement à prendre en compte est la mise à niveau vers PackageReferences au lieu de package.configfichiers.

Consultez ce guide et vous voudrez peut-être également un outil pour aider à la mise à niveau . Il nécessite cependant une version tardive de VS 15.7.

Quango
la source
2
Je pense que quiconque arrive ici devrait également consulter ces excellents conseils sur l'écriture de bibliothèques open source par l'auteur de Newtonsoft.JSON: docs.microsoft.com/en-us/dotnet/standard/library-guidance/… - en particulier "Eviter y compris une cible netstandard1.x "et utilisez .NET 4.7.2 comme version réelle la plus basse prenant en charge .netstandard 2.0
Quango
Exactement ce qui était nécessaire lors de la mise à niveau vers la v4.7.2 (application non principale) et a obtenu une exception comme la suivante: "Le type 'DateHeure' 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 = neutre, PublicKeyToken = cc7b13ffcd2ddd51 '.
Ted
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?
petrosmm
1
Très bonne réponse. Merci. J'étais en train de mettre à niveau un ancien package d'utilitaires et j'ai giflé un nouveau standard 2.0 à sa place. Cette application Web en particulier avait des problèmes car <add assembly="netstandardil manquait et que httpRuntime n'était pas 4.7.1 - C'est la réponse! Merci !!
Piotr Kula
Dans notre cas, nous avions plusieurs assemblys 2.0 standard en cours d'utilisation par un projet ASP.Net 4.7.2, mais nous avons ajouté du JsonConverter à partir de l'espace de noms System.Text.Json.Serialization à l'un des projets 2.0 standard et cela a provoqué cette erreur. Cette solution a résolu notre problème.
ShaneH le
35

Éditer manuellement le fichier .csproj et ajouter la référence ci-dessous a fonctionné pour moi.

<Reference Include="netstandard" />

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

kamilk
la source
Où doit-il être placé dans le fichier de projet? Dans quel autre "tag"?
Ulysses Alves
1
@UlyssesAlves Somewhere à côté d'autres balises de référence
kamilk
@kamilk "quelque part à côté d'un autre" n'est pas très précis. Eh bien, 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 sous un autre angle, ce qui n'implique pas de changer la version .net du projet.
Ulysses Alves
1
Celui-ci a fonctionné pour moi, j'ai également dû installer la NetStandard.Library via NuGet.
David Acero
Les petites choses qui "vous attirent" ... Excellente réponse.
Benj Sanders
15

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

  1. Installez la NetStandard.Library via NuGet
  2. Modifier manuellement le fichier .csproj et ajouter la référence. <Reference Include="netstandard" />
  3. Projet d'expansion -> Références dans l'explorateur de solutions VS, clic droit sur «netstandard» et affichage de la page de propriétés et définition de «Copier local» sur true.
Damien Sawyer
la source
3
Le réglage «Copier local» l'a fait pour moi.
FrenkyB
1
Cette solution fonctionne parfaitement et le projet ne dépend pas de la compilation en mode débogage.
DarkHawk
6

J'ai déjà rencontré ce problème et essayer un certain nombre de choses a résolu le problème pour moi:

  • Supprimer un dossier bin s'il existe
  • Supprimer le dossier .vs caché
  • Assurez-vous que le pack de ciblage 4.6.1 est installé
  • Last Ditch Effort: Ajoutez une référence à System.Runtime (clic droit sur projet -> ajouter -> référence -> cochez la case à côté de System.Runtime), bien que je pense avoir toujours compris que l'un des éléments ci-dessus l'a résolu à la place de faire cela.

De plus, s'il s'agit d'une application principale .net fonctionnant sur le framework complet, j'ai constaté que vous devez inclure un fichier global.json à la racine de votre projet et le pointer vers le SDK que vous souhaitez utiliser pour ce projet:

{
  "sdk": {
    "version": "1.0.0-preview2-003121"
  }
}
Kyle Dodge
la source
2
J'ai tout essayé, pas de chance. Ce n'est pas un projet .NET Core comme je l'ai dit. Il s'agit d'un .NET Framework 4.6.1 normal.
emzero
Fermez VS, supprimez la corbeille, supprimez .vs - je suis heureux.
Reed Shilts le
5

La suppression des dossiers Bin et Obj a fonctionné pour moi.

Vijay Verma
la source
5

Après la mise à niveau du framework 4.6.1 vers 4.7.2, nous avons commencé à obtenir cette erreur:

"Le type 'System.Object' 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'." et finalement la solution était d'ajouter la référence d'assemblage "netstandard" mentionnée ci-dessus:

<compilation debug="true" targetFramework="4.7.1" >
    <assemblies>
      <add assembly="netstandard, Version=2.0.0.0, Culture=neutral, 
            PublicKeyToken=cc7b13ffcd2ddd51"/>
    </assemblies>
  </compilation>
Raghav
la source
1
Cela marche. Une autre chose qui fonctionne (sans ce changement) est d'ajouter le <Reference Include="netstandard" />au fichier csproj, MAIS ... cela ne fonctionne que si vous définissez AUSSI CopyLocal sur true. Rien de tout cela n'a de sens.
Triynko
1

Bien que ce soit un ancien thread, j'ai eu le même problème aujourd'hui, la semaine dernière, j'ai mis à jour certains packages NuGet et bien que le site Web MVC fonctionnait bien sur ma machine de développement lorsque j'ai publié sur le serveur de test, il a échoué.

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 netstandard.dll n'était pas téléchargé, une fois téléchargé, le site Web fonctionnait correctement, je ne sais pas pourquoi VS2017 Web deploy n'a pas publié la DLL.

Juste quelque chose à surveiller au cas où rien de ce qui précède ne fonctionne pour vous.

George Phillipson
la source
1

J'ai vécu cela lors de la mise à niveau de .NET Core 1.1 vers 2.1.

J'ai suivi les instructions décrites ici .

Essayez de supprimer <RuntimeFrameworkVersion>1.1.1</RuntimeFrameworkVersion>ou <NetStandardImplicitPackageVersion>section dans le .csproj.

h-rai
la source
1

Nous avons commencé à obtenir cette erreur sur le serveur de production après le déploiement de l'application migrée de 4.6.1 vers 4.7.2.

Nous avons remarqué que le .NET Framework 4.7.2 n'y était pas installé. Afin de résoudre ce problème, nous avons suivi les étapes suivantes:

  1. Installé le .NET Framework 4.7.2 à partir de:

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

  2. Redémarré la machine

  3. Confirmation de la version .NET Framework à l'aide de Comment trouver la version .NET?

La réexécution de l'application avec la version .Net Framework 4.7.2 installée sur la machine a résolu le problème.

Raghav
la source
1

Je suis confronté au même problème que je fais en suivant la configuration immédiate de l'application fonctionne correctement

1-

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

2- Ajouter une référence

 **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
la source
Où est-ce documenté? Comment quelqu'un pourrait-il imaginer de mettre cette ligne dans un fichier web.config? Incidemment, ce qui fonctionne aussi bien, c'est d'ajouter une ligne au csproj qui fait référence à «netstandard» et de définir CopyLocal sur true. Même dans ce cas, ce n'est même pas répertorié comme référence possible dans la boîte de dialogue des références, donc la seule façon de l'obtenir est de l'ajouter manuellement. C'est insensé. Et je cible .NET 4.7.2, qui est censé être entièrement compatible avec la norme .NET, mais je dois suivre ces étapes obscures pour le faire fonctionner.
Triynko
0

Pourrait avoir à faire avec l'un de ceux-ci:

  1. Installez un SDK plus récent.
  2. Dans .csproj, vérifiez la référence Inclure = "netstandard"
  3. Vérifiez les versions d'assembly dans les balises de compilation dans Views \ Web.config et Web.config.
ivw
la source
ok j'espère que nous y sommes presque. "J'ai ajouté la référence à NETStandard.Library au lieu de NETStandard.Library.NETFramework" vérifier ce post: github.com/dotnet/standard/issues/391
ivw
Généralement System.Transactions ne fait pas partie de vos références, essayez de l'ajouter dans vos références par: un clic droit sur vos références si vous utilisez une application Web ou dans votre projet si vous utilisez un site Web. recherchez le System.Transactions dans les références .NET. Vous devriez trouver le System.Transactions dans vos références.
ivw
0

entrez la description de l'image ici Définissez Copy Enbale sur true dans les propriétés netstandard.dll.

Ouvrez l'Explorateur de solutions et faites un clic droit sur netstandard.dll. Définissez Copy Local sur true.

hani abukhurma
la source
0

J'étais confronté à ce problème en essayant d'ajouter une dépendance .NETStandard à une bibliothèque .NET4.6.1 et de la compiler sous Linux avec Mono 4.6.2 (la version fournie avec Ubuntu 16.04).

Je l'ai finalement résolu aujourd'hui; la solution nécessite de faire ces deux choses:

  1. Remplacez <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>par <TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>dans le fichier .csproj.
  2. Mettez à niveau votre mono vers une version plus récente. Je pense que 5.x devrait fonctionner, mais pour être sûr, vous pouvez simplement installer Ubuntu 20.04 (qui au moment de la rédaction n'est qu'en préversion), qui inclut Mono 6.8.0.105.
knocte
la source
0

Vous pouvez ajouter à votre web.config dans votre projet.

Cela ne fonctionnerait pas lorsque vous l'ajoutiez aux projets web.config car cela fonctionne avec MVC.

MEO
la source
0

Dans mon cas, j'ai découvert que le nuget problématique était System.Memory dans la version 4.5.1. une fois mis à jour vers la version 4.5.3, cela fonctionne !!

bk
la source
0

Ceux qui n'ont pas de fichier web.config. Type de sortie autre que l'application Web. mettre à jour le fichier de projet (.csproj) avec le code ci-dessous.

Cela peut être dû à l'ajout / suppression du .netframework de manière incorrecte ou il peut se briser de manière inattendue.

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

Le type de sortie

  • Application de la console
  • Bibliothèque de classe
Thiya
la source
-5

Ce problème est basé sur votre version installée de Visual Studio et de Windows, vous pouvez suivre les étapes suivantes: -

  1. Aller à la fenêtre de commande
  2. a rétrogradé votre PCL par la commande suivante

    Install-Package Xamarin.Forms -Version 2.5.1.527436
  3. Reconstruisez votre projet.
  4. Vous pourrez maintenant voir la sortie requise
Rakendu Shukla
la source