web-dev-qa-db-fra.com

Comment puis-je résoudre les conflits de version d'Assembly avec JSON.NET après la mise à jour des références de package NuGet dans un nouveau projet ASP.NET MVC 5?

J'ai créé un nouveau projet Web ASP.NET MVC 5 dans VS 2013 (mise à jour 1), puis mis à jour tous les packages NuGet. Lorsque je construis le projet, je reçois l'avertissement suivant:

warning MSB3243: Impossible de résoudre le conflit entre "Newtonsoft.Json, Version = 6.0.0.0, Culture = neutre, PublicKeyToken = 30ad4fe6b2a6aeed" et "Newtonsoft.Json, Version = 4.5.0.0, Culture = neutre, PublicKeyToken = 30ad4fe6b2a6aeed".

Cependant, lorsque je vérifie le fichier web.config, je constate qu’une redirection de liaison est en place:

  <dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
  </dependentAssembly>

Quel est exactement ce que l'avertissement conseille.

Comment puis-je résoudre cet avertissement?

78
Jim Lamb

Voici les étapes que j'ai utilisées pour résoudre l'avertissement:

  • Décharger le projet dans VS
  • Editer le fichier .csproj
  • Rechercher toutes les références à Newtonsoft.Json Assembly
    • Trouvé deux, un à v6 et un à v5
    • Remplacer la référence à v5 par v6
  • Recharger le projet
  • Construire et remarquer un échec de référence d'assemblage
  • Voir les références et voir qu’il en existe maintenant deux pour Newtonsoft.Json. Supprimez celui qui ne parvient pas à résoudre.
  • Reconstruire - pas d'avertissement
95
Jim Lamb

J'ai eu ce problème parce que j'ai mis à jour des packages, y compris Microsoft.AspNet.WebApi, qui contient une référence à Newtonsoft.Json 4.5.6 et que j'avais déjà la version 6 installée. Ce n’était pas assez intelligent pour utiliser la version 6.

Pour résoudre ce problème, après la mise à jour WebApi, j'ai ouvert Outils> Gestionnaire de paquets NuGet> Console Pacakge Manager et exécuté:

 Update-Package Newtonsoft.Json

Le journal a montré que les versions 6.0.x et 4.5.6 avaient toutes été mises à jour et que tout allait bien.

J'ai le sentiment que cela va revenir.

27
McGaz

J'ai trouvé pour supprimer cette section du fichier projet résoudre le problème.

<ItemGroup>
<Reference Include="Newtonsoft.Json">
  <HintPath>..\packages\Newtonsoft.Json.6.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
15
szmulder

Si rien de ce qui précède ne fonctionne, essayez ceci dans web.config ou app.config:

<runtime>
    <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30AD4FE6B2A6AEED" culture="neutral"/>
            <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>
9
ZeroDotNet

La solution finale à vos erreurs de redirection d'assemblage

D'accord, j'espère que cela devrait aider à résoudre toutes les (saines) anomalies de référence de l'Assemblée ...

  1. Vérifiez l'erreur.

Surf to the website

  1. Vérifiez web.config après la redirection d'assembly. Créez-en un sinon existe.

Existing web.config Assembly redirect

  1. Cliquez avec le bouton droit sur la référence de l'assembly et choisissez Propriétés.

Assembly in the Reference list, in the relevant project

  1. Vérifiez la version (pas la version d'exécution) dans le tableau Propriétés. Bien reçu.

Properties table showing Version of Assembly

  1. Collez dans l'attribut newVersion.

web.config Assembly redirect with updated newVersion

  1. Pour plus de commodité, changez la dernière partie de la vieille version en quelque chose de haut, rond et imaginaire.

web.config Assembly redirect with updated oldVersion

Réjouir.

5
user3638471

Rappelez-vous qu'avec la redirection de liaison

oldVersion = "0.0.0.0-6.0.0.0"

Vous dites que les anciennes versions de la DLL sont comprises entre la version 0.0.0.0 et la version 6.0.0.0.

3
Sherlock-jr

J'ai mis à jour de Newtonsoft.Json 11.0.1 à 12.0.2. Ouverture du fichier de projet dans Notepad ++ J'ai découvert les deux

<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
      <HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
    </Reference>

et

<ItemGroup>
    <Reference Include="Newtonsoft.Json">
      <HintPath>..\packages\Newtonsoft.Json.11.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
    </Reference>
  </ItemGroup>

J'ai supprimé le groupe d'éléments en enveloppant la référence avec le chemin d'accès à la version 11.0.1.

Ces problèmes peuvent être incroyablement frustrants à trouver. De plus, les développeurs suivent souvent les mêmes étapes que les configurations précédentes du projet. Les configurations précédentes n'ont pas rencontré le problème. Pour une raison quelconque, le fichier de projet est parfois mis à jour de manière incorrecte.

J'espère sincèrement que Microsoft résoudra ces problèmes d'enfer de Visual Studio DLL. Cela se produit beaucoup trop souvent et arrête les progrès jusqu'à ce qu'ils soient corrigés, souvent par essais et erreurs.

3
Jeremy Ray Brown

Personne n'a mentionné ce qui suit, ce qui à mon sens est la solution correcte:

Accédez au csproj du projet où le nuget est installé et définissez la variable AutoGEneratedBindingRedirects sur false.

<AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>

Article complet dans MSDN.

0
Veverke

J'ai mis à jour mon paquet et je l'ai même réinstallé - mais je recevais toujours exactement la même erreur que l'OP mentionné. J'ai manuellement modifié la DLL référencée en procédant comme suit.

J'ai supprimé le newtonsoft.json.dll de ma référence, puis j'ai supprimé manuellement le fichier .dll du répertoire bin. Ensuite, j’ai copié manuellement le fichier newtonsoft.json.dll du dossier du paquet Nuget dans le bin du projet, puis j’ai ajouté la référence en naviguant dans le fichier .dll.

Maintenant, mon projet repose à nouveau.

0
Adam Heeg

J'ai eu le même problème et je voulais juste poster une réponse pour les autres dans ma situation.

J'ai une solution qui exécute une application Web ASP.NET avec plusieurs autres projets lib de classe C #.

Mon application Web ASP.NET n'utilisait pas json, mais d'autres projets où.

Voici comment je l'ai corrigé:

  1. Je me suis assuré que tous les projets utilisant la dernière version (6) utilisant NuGet Update étaient compatibles avec tous les projets utilisant actuellement une version de json - cela n'a pas résolu le problème
  2. J'ai ajouté json à l'application Web en utilisant NuGet - cela a résolu le problème (laissez-moi plonger dans pourquoi):

L'étape 2 consistait tout d'abord à ajouter des informations de configuration pour JSON, suggérant que tous les projets utilisent la dernière version (6), quelle que soit leur version. L'ajout de la liaison Assembly à Web.Config est probablement le correctif.

Cependant, l'étape 2 a également nettoyé le code hérité de som. Il s’est avéré que nous avions précédemment utilisé une ancienne version (5) de JSON dans notre application Web et que les dossiers de NuGet n’avaient pas été supprimés lorsque la référence a été supprimée (je suppose: manuellement). Ajout du dernier json (6), supprimé les anciens dossiers (json v5). Cela pourrait également faire partie du correctif.

0
Nick Niebling