web-dev-qa-db-fra.com

Newtonsoft.Json Assembly Conflict

J'utilise Netonsoft.Json dans mon projet. Cela fonctionne bien jusqu'à ce que je commence à intégrer Paypal SDK dans mon projet. Mon code est comme ci-dessous.

         String AccessToken =
  new Paypal.OAuthTokenCredential("", "").GetAccessToken(); ---->>>> This Line Throwing An Error
            Paypal.Api.Payments.Address add = new Paypal.Api.Payments.Address();
            add.city = TextBoxCity.Text;
            add.line1 = TextBoxAddress.Text;
            add.phone = TextBoxPhoneNumber.Text;
            add.postal_code = TextBoxZipcode.Text;
            add.state = TextBoxState.Text;
            Paypal.Api.Payments.CreditCard cc = new Paypal.Api.Payments.CreditCard();
            cc.number = TextBoxCreditCardNumber.Text;
            cc.first_name = TextBoxFirstName.Text;
            cc.last_name = TextBoxLastName.Text;
            cc.expire_month = Convert.ToInt16(TextBoxExpiryMonth.Text);
            cc.expire_year = Convert.ToInt16(TextBoxExpiryYear.Text);
            cc.cvv2 = TextBoxCVVNumber.Text;
            cc.billing_address = add;
            cc.Create(AccessToken);

et je reçois une erreur comme ci-dessous 

       System.IO.FileLoadException: Could not load file or Assembly 'Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located Assembly's manifest definition does not match the Assembly reference. (Exception from HRESULT: 0x80131040)

Je recherche sur internet et trouve une solution pour changer le fichier de configuration. SO Je change mon fichier de configuration comme ci-dessous

        <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
     <bindingRedirect oldVersion="0.0.0.0-3.5.0.0" newVersion="4.5.0.0" />
  </dependentAssembly>
</assemblyBinding>

Je m'amuse aussi à utiliser des propriétés d'assemblage telles que Copier une version locale ou spécifique mais rien ne m'aide à résoudre ce problème. Comment puis-je résoudre le conflit de l'Assemblée?

29
Hiren

Je viens d’avoir le même problème et je l’ai résolu en mettant à jour Newtonsoft.Json avec la dernière version en utilisant 

Update-Package Newtonsoft.Json

puis aller à Web.config et ajouter:

<dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed"/>
    <bindingRedirect oldVersion="0.0.0.0-4.5.0.0" newVersion="5.0.8"/>
</dependentAssembly>
60
Harold

+1 à zbarrier pour sa solution. Voici pourquoi cela a fonctionné ...

+1 à zbarrier pour sa réponse qui m'a aidé à résoudre mon problème. Les problèmes de référence à l’Assemblée sont les pires… c’est pourquoi j’ai pensé publier les étapes que j’ai prises, ainsi que certaines choses que j’ai apprises, et j'espère que cela aide:


  1. FAILED ATTEMPT: a collé les lignes suivantes dans mon web.config:

    <runtime>
        <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed"/>
            <bindingRedirect oldVersion="0.0.0.0-4.5.0.0" newVersion="5.0.8"/>
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
    

    ^^^^^ DID N'A PAS FONCTIONNÉ


  1. SOLUTION: _ a accédé à ~/Bin/Newtonsoft.Json.dll et a ouvert le fichier dans Visual Studio. Par défaut, l'interface du fichier affiche un dossier Nommé d'après l'Assemblée. J'ai double-cliqué dessus pour l'agrandir, et A finalement vu ceci: Assembly-file interface Ensuite, j'ai double-cliqué Sur l'icône 1 [Neutral] qui m'a amené à l'information de l'Assemblée, Vue ici: Assembly-file information

    La ligne indiquant Assembly Version correspond à ce que vous devez entrer Dans l'attribut newVersion de la balise <bindingRedirect>. Alors j'ai pris La section que j'ai collée (dans la première étape) et changer le "5.0.8" à "6.0.0.0". Ma nouvelle section <runtime> ressemble à ceci:

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

    ^^^^^ CELA A FONCTIONNÉ !! Finalement...


Autres notes au cas où quelqu'un serait encore confus:

  • la balise <runtime> se trouve dans la balise <configuration></configuration> dans le fichier web.config. La section que je montre ci-dessus a été collée directement sous la balise d'ouverture de la section <configuration> de mon web.config.
  • l'attribut xmlns représente l'espace de nom XML correspondant . Il est utilisé par les développeurs de Assembly pour éviter les problèmes liés aux balises en conflit. Dans ce cas, vous devriez vous sentir en sécurité en utilisant le xmlns="schemas-Microsoft-com:asm.v1" ci-dessus.
  • vous pouvez modifier l'attribut oldVersion pour transférer des versions supplémentaires de Assembly. Par exemple, je vais probablement modifier le mien en Qui ressemble davantage à la réponse de zbarrier .
  • la publicKeyToken est un autre attribut qui reste à peu près le même Il en va de même pour Newtonsoft.Json. PublicKeyToken est juste une version raccourcie de la clé publique - un peu comme un titre est un livre .__ - et, dans ce cas, ne change pas vraiment. Si vous voulez connaître la clé publique d’un assemblage, ouvrez simplement le Developer Command Prompt qui se trouve dans le menu Démarrer, puis utilisez la commande Invite pour accéder à l’emplacement. ~\Bin\) et exécutez la commande sn -T nom_fichier_assembly. Donc, dans ce cas, la commande était sn -T Newtonsoft.Json.dll. Vous devriez obtenir une réponse du type Ceci: sn command response Comme vous pouvez le constater, la clé publique De Newtonsoft (30ad4fe6b2a6aeed) est située juste à la fin.
33
Lopsided

J'ai rencontré le même problème pour Assembly version 6.0.1. J'ai collé les lignes suivantes dans le web.config comme dirigé par Harold:

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

J'ai ensuite supprimé la référence du projet à Newtonsoft.Json et la référence à Newtonsoft.Json dans le fichier packages.config.

J'ai ouvert le Nuget Manager et réinstallé Newtonsoft.Json.

L'installation a modifié les paramètres web.config comme suit et tout a bien fonctionné:

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

Au début, je pensais que mon cas était la même référence d’Assemblée que la précédente. 

Rien n'a fonctionné jusqu'à ce que j'ai découvert qu'une autre assemblée posait problème.

Dans mon cas, mon code échouait lorsque j'ai appelé la méthode HttpClient.PostAsJsonAsync (requestURI, T). L'erreur concernant Assembly Reference m'a ébranlé car ma solution comporte plusieurs projets et dans lesquels certains d'entre eux utilisaient une ancienne version ... ont fini par perdre beaucoup de temps jusqu'à ...

Ma solution:

  • Suppression du System.Net.Http.Formatting existant de mes références
  • Installé le package d'installation Microsoft.AspNet.WebApi.Client - qui A installé le Http.Formatting requis.

Une fois installé, le PostAsJsonAsync () a fonctionné comme prévu!

J'espère que cela fait gagner du temps à quelqu'un que j'ai perdu à la recherche d'une solution!

2
Gotcha

J'ai rencontré le même problème, j'ai installé Newtonsoft.Json v9.0.1, sandcastle arrête la construction en affichant la même erreur mais avec une différence de version: "Impossible de charger le fichier ou l'assembly 'Newtonsoft.Json, Version = 6.0.0.0, "

ce qui a fonctionné: recherchez/créez un projet avec newtonsoft.json avec la version demandée par SandCastle, ajoutez le fichier "Newtonsoft.Json.dll" en tant que référence au projet SC, puis générez ..__ (vous pouvez trouver la dll dans le dossier bin du projet)

0
Apex ND