web-dev-qa-db-fra.com

Newtonsoft.json Incompatibilité de version de package d'assembly

J'essaie d'utiliser SocketIO4Net pour créer un client socket.io en .net. SocketIO4Net a une dépendance de Newtonsoft.Json> = 4.0.8. J'utilise aussi PushSharp library qui a une dépendance Newtonsoft.Json de> = 4.5.10. J'ai eu NewtonSoft.Json 4.5.11 lorsque j'ai installé PushSharp pour la première fois et je pensais que cette version devrait également prendre en charge SocketIO4Net, car c'est une version supérieure, mais j'obtiens cette erreur chaque fois que j'essaie de me connecter au serveur socket.io.

Impossible de charger le fichier ou l'assembly 'Newtonsoft.Json, Version = 4.0.8.0, Culture = neutre, PublicKeyToken = 30ad4fe6b2a6aeed' ou l'une de ses dépendances. La définition du manifeste de l'Assemblée localisée ne correspond pas à la référence de l'Assemblée. (Exception de HRESULT: 0x80131040)

Je me suis cogné la tête toute la journée avec ces problèmes de dépendance, je serais très reconnaissant si quelqu'un peut me diriger dans la bonne direction.

21
Bitsian

Solution trouvée, essayez avec: 

<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>
18
ZeroDotNet

Vous pouvez modifier la configuration de l'assemblage avec une liaison et ajouter une redirection. Voir Redirection de versions d'assemblage sur MSDN.

En gros, vous voulez ajouter l'extrait suivant à votre fichier app.config ou web.config:

<configuration>
   <runtime>
     <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
       <dependentAssembly>
         <assemblyIdentity name="Newtonsoft.Json"
                           publicKeyToken="30ad4fe6b2a6aeed"
                           culture="neutral" />
         <!-- 
           Assembly versions can be redirected in application, 
           publisher policy, or machine configuration files.
         -->
         <bindingRedirect oldVersion="1.0.0.0-4.5.11.0" newVersion="4.5.11.0"/>
       </dependentAssembly>
     </assemblyBinding>
   </runtime>
</configuration>

MODIFIER

Pourquoi avez-vous besoin de rediriger les versions de Assembly? Bien que SocketIO4Net prenne en charge les versions les plus récentes de Newtonsoft.Json, il a été compilé avec une version unique (4.0.8 dans votre cas). Cette version est stockée dans la DLL et sert à charger les DLL dont dépend SocketIO4Net.

Notez que les dépendances NuGet ne sont pas identiques aux dépendances DLL/runtime - La dépendance NuGet à Newtonsoft.Json> = 4.0.8 signifie uniquement que vous serez autorisé à installer SocektIO4Net dans un projet doté d'une version plus récente de Newtonsoft.Json. rien à voir avec les paramètres d'exécution.

Cela étant dit, les versions récentes de NuGet devraient ajouter automatiquement les redirections d'assemblage-assemblage si votre projet contient un fichier app.config ou web.config.

6
Miroslav Bajtoš

Je travaillais sur un ancien projet récemment. Je devais mettre à jour notre fichier Newtonsoft.Json.dll, car je devais utiliser une "nouvelle" API qui nécessitait une version plus récente, mais il me restait d'autres DLL nécessitant l'ancienne version.

bindingRedirect vous dites? Nan. Il a continué à se plaindre de l'inadéquation manifeste.

Séparer codeBase tags? Nan. Il a continué à se plaindre de l'inadéquation manifeste.

Le problème était, apparemment, que l'ancienne version de Newtonsoft.Json.dll (3.0.0.0) N'A PAS de PublicKeyToken , mais la "nouvelle" version (4.5.7.1) DOES un PublicKeyToken . Par conséquent, ils ne peuvent pas partager le même tag dépendant de l'Assembly.

C'est ce que j'ai fini avec:

<dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="" culture="neutral"/>
    <codeBase version="3.0.0.0" href="bin\Newtonsoft_Old\Newtonsoft.Json.dll" />
</dependentAssembly>
<dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
    <codeBase version="4.5.0.0" href="bin\Newtonsoft.Json.dll" />
</dependentAssembly>

Avait ce même problème.

Vient de le résoudre.

Cela s'est passé après que NuGet a été utilisé pour installer Ext.NET qui a une dépendance pour Newtonsoft.JSON.
Il y avait déjà un fichier Newtonsoft.JSON.dll dans le dossier/bin (et évidemment une référence à ce fichier dans le fichier web.config) sans vérifier que j'avais lancé la procédure d'installation du package NuGet lors du débogage (le fichier avait donc probablement un problème. fermer à clé).

Sur la fenêtre d'erreur d'exécution, il vous indiquera sur la trace de la pile quelle partie du manifeste il a un problème, la version principale étant la version majeure, j'ai donc vérifié la version du package d'installation. et c'était une version majeure sur. Trouvé le fichier NuGet d'origine sous: "[chemin physique] /../ packages/Newtonsoft.Json. [Version]/lib/[. Version net] /"

Manifest et Library se trouvaient là. Ils ont donc été copiés dans le dossier/bin, mis à jour les informations d'assembly racine de web.config et tout a fonctionné.

Échantillons de code: Avant

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

Après

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

J'espère que cela t'aides

1
Kickass

Dans mon cas, j'ai retiré le paquet avec NuGet et en ai installé un nouveau. Ensuite, supprimez la référence de références et ajoutez à nouveau manuellement. Fonctionne comme un charme. J'espère résoudre pour vous.

1
Gerson C Filho

Placez une redirection d'assemblage dans votre application/web.config;

   <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" PublicKeyToken="30ad4fe6b2a6aeed" />
        <bindingRedirect oldVersion="1.0.0.0-4.5.11.0" newVersion="4.5.11.0" />
      </dependentAssembly>

Veuillez noter que les numéros de version doivent correspondre à la version que vous avez installée.

1
ChrisBint

Les solutions ci-dessus sont correctes mais il ne faut pas oublier un autre point: le contenu de app.config était identique à celui des solutions ci-dessus.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

Mais c'est une bonne idée de vérifier si c'est à jour. Dans mon cas, Newtonsoft.JSON (v.6.0.4) dépend désormais d'un autre package.

 enter image description here

Il y a deux options;

  1. Update (package Newtonsoft.JSON) dernières versions.
  2. Mettez à jour le fichier app.config dans les numéros de version.

Et dernier conseil, si vous travaillez avec plus d’un projet, par exemple . exe-dll et vérifiez les deux versions s'il y a Newtonsoft.JSON.

1
EgoistDeveloper

Vous avez obtenu l'erreur ci-dessus: dans Visual Studio 2013 Solution: Dans le package mamnager, exécutez-le: package d'installation newtonsoft.json Cela ajoutera une nouvelle ligne dans packages.config <package id="Newtonsoft.Json" version="6.0.5" targetFramework="net45" /> Supprimez la ligne précédente ce qui pourrait pointer vers la version précédente sur packages.config . Supprimer le répertoire de l'ancienne version sur le répertoire packagers . Supprimer la référence de NewtonSoft.Json et la relire pointant vers la dernière version. Webconfig racine aura les éléments suivants <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> Une fois que tout est fait. Fermez et rouvrez Visual Studio. Cela devrait résoudre le problème. J'ai eu la même erreur lors de l'installation de PM> install-package durandal.starterkit J'ai utilisé la méthode ci-dessus pour corriger le problème. 

0
Venkat

Cela vient d’arriver avec TeamCity et j’imagine que d’autres vont bientôt en faire l'expérience. Ceci s’applique probablement à à la plupart des serveurs de compilation qui extraient les paquets NuGet. 

Toutes les réponses indiquant que les redirections sont correctes. Cependant, vous devez toujours définir le numéro de version correct. Mon projet utilisait Newtonsoft.Json 7.0; cependant, ils venaient de publier 8.0 et TeamCity extrayait 8.0, ce qui posait des problèmes uniquement sur le serveur et non localement. Toutes mes redirections ont été définies sur 7.0.

Assurez-vous que l'application déployée obtient réellement la version correcte de NuGet et pas seulement la dernière et la plus performante. Ou mettez à jour votre configuration pour pointer vers la version la plus récente.

0
TyCobb