2
votes

Impossible de charger le fichier ou l'assembly 'Newtonsoft.Json, Version = 10.0.0.0

Je ne comprends pas le problème suivant auquel je suis confronté.

J'ai 3 projets, A, B et C. Tous ont une référence à Newtonsoft.Json , version 12.0.1

Le projet a fait référence aux projets B et C. Le projet B, a une référence à Microsoft.IdentityModel.Tokens.Jwt

Lorsque j'exécute le projet A, j'obtiens l'erreur d'exécution suivante en essayant d'exécuter la fonction nécessaire à la création de mon jeton.

< gagnantMessage :

"L'initialiseur de type pour 'System.IdentityModel.Tokens.Jwt.JsonExtensions' a levé une exception."

Exception interne:

"Impossible de charger le fichier ou l'assembly 'Newtonsoft.Json, Version = 10.0.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed' ou l'une de ses dépendances. Le système ne trouve pas le fichier spécifié."

J'ai vérifié que tous les projets référencent le même package Newtonsoft.Json avec la version 12.0.1 . J'ai également vérifié mes fichiers de projet, pour m'assurer qu'il n'y a pas de référence à Newtonsoft.Json version 10.0.0.0

Que me manque-t-il?


8 commentaires

Avez-vous essayé de consolider le package nuget pour l'ensemble de la solution?


Que voulez-vous dire par consolidation?


S'agit-il d'un projet Web ou d'une application Windows? Jetez un œil à web.config ou app.config , s'il y a une entrée avec Newtonsoft.Json et le mauvais numéro de version


@schlonzo Un projet est une fonction Azure, les deux autres projets sont des bibliothèques de classes


Vous devrez probablement ajouter une redirection d'assembly


@Liam va vérifier ça


Si vous utilisez packages.config pour les références NuGet, la migration vers PackageReference peut résoudre les problèmes, car PackageReference prend en charge les dépendances transitives (packages.config ne le fait pas) et peut généralement générer automatiquement des redirections de liaison si nécessaire.


Avez-vous par hasard un projet dans un autre dossier de projet? Le projet A a un dossier de projet A et le projet B est à l'intérieur du dossier de projet A.


5 Réponses :


-1
votes

Là où vous utilisez Microsoft.IdentityModel.Tokens.Jwt, ne l'ajoutez pas en tant qu'utilisation à la page mais faites-y une référence directe.


2 commentaires

Je veux bien essayer. Ça vous dérange d'expliquer pourquoi vous pensez que cela devrait le résoudre?


Il semble que tout ce qui utilise Microsoft.IdentityModel.Tokens.Jwt dans la classe B essaie d'utiliser Newtonsoft.Json version 10.0.0.0 mais se confond avec la version 12.0.0.0 de Newtonsoft.Json qui est référencée dans les classes A et C. I peut avoir mal compris, mais j'ai déjà eu des situations similaires à celle-ci. J'ai également résolu ce problème en désinstallant et en réinstallant les packages



1
votes

Je pense que certains de vos projets font référence à la version 10, tandis que d'autres font référence à la version 12 de newtonsoft.json.dll.

Il semble que la DLL v12 soit copiée dans le répertoire de sortie. Le projet qui fait référence à la v10 lève cette erreur.

Pour tous les assemblys à nom fort, la version spécifique de la DLL est recherchée dans le répertoire de l'application ou dans le GAC. Vous pouvez remplacer ce comportement par défaut en utilisant l'entrée de fichier de configuration ci-dessous - qui indique au framework .net de toujours rechercher la v12 chaque fois qu'une version de 0 à 12 est appelée.

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

J'espère que cela vous aidera à résoudre votre problème.


6 commentaires

Dois-je modifier cette liaison d'assembly dans le projet qui lève l'erreur?


Le projet qui génère l'erreur a le bindingRedirect suivant:


Est-ce une application (ex: .EXE) ou une DLL? Veuillez ajouter cette redirection de liaison au fichier de configuration de l'application (exe).


Le projet dans lequel l'erreur est renvoyée est un package nuget (DLL)


Selon votre question, vous exécutez le projet «A». Cela signifie que vous devrez mettre le fichier de configuration de ce projet de redirection de liaison A.


J'ai voté pour. Votre réponse aurait fonctionné si je n'avais pas créé une application Azure Function. J'ai dû faire un peu de travail supplémentaire, comme vous le verrez dans ma réponse ci-dessous.



0
votes

Découvrez quel projet tente de charger cette bibliothèque. Faites un clic droit sur projet-> Gérer les packages Nuget-> Rechercher la bibliothèque NewtonJson dans les bibliothèques installées et cliquez sur Désinstaller, peut-être que cela vous aidera. Vous pouvez également rediriger l'assembly comme les personnes fournies avant l'utilisation.


0 commentaires


1
votes

Newtonsoft Json, bien qu'utile, est la source de nombreux problèmes.

Vous devrez vérifier tous les packages NuGet référencés par chaque projet de votre solution pour voir quelle version de Newtonsoft Json ils ont besoin. Certains spécifient une version minimale, auquel cas vous n'avez pas de problème (comme> 10, tout ce qui est supérieur à 10 fonctionnera), d'autres nécessitent une certaine version fixe (= 10, doit être 10, pas moins, pas plus) . C'est à l'auteur de ce package NuGet particulier.

Lorsque vous cliquez sur build, les dll requises par les packages référencés seront copiées, puis les dlls requises par tout projet référencé seront copiées et il est possible qu'une certaine version soit copiée et lorsque vous exécutez votre application, vous obtenez l'erreur que vous avez vue.

Vous pouvez vérifier cela en regardant dans le dossier bin de votre profil de build, cliquez avec le bouton droit sur le fichier dll et inspectez sa version pour voir ce que vous avez. La redirection d'assembly devrait aider, lorsqu'elle est effectuée au bon endroit, mais il existe une solution alternative, même si ce n'est pas toujours possible.

Si vous pouvez déposer le Newtonsoft Json à la version minimale qui satisfait toutes les exigences, c'est une bonne façon de résoudre le problème. Il y a de fortes chances que vous n'ayez pas besoin de la version 12, en fonction de ce que vous en utilisez et de ce que les autres packages nécessitent. Vous pourrez peut-être modifier tous les projets pour référencer la version inférieure sans aucun effet secondaire. Si vous le pouvez, vous êtes en or, assurez-vous simplement de ne pas mettre à niveau par erreur. Sinon, vous devrez rediriger la version comme indiqué dans d'autres réponses.

L'idée de base est de s'assurer que dans votre solution, vous n'utilisez qu'une seule version de Newtonsoft. vous pouvez vérifier ce package au niveau de la solution, il existe également une option de consolidation.

Donc, vérifiez tous les projets de la solution, assurez-vous qu'ils utilisent tous une version de Newtonsoft et que cette version est la même pour tous.

Une fois que vous parvenez à tout mettre sur un seul niveau, assurez-vous que:

  1. vous supprimez le contenu du dossier temporaire ASp.Net, dans Windows / Microsoft.Net, Framework23 ou 64 dépend de celui que vous utilisez.

  2. supprimez toutes les DLL de tous les dossiers bin, un simple nettoyage peut ne pas suffire.

Avec tout cela fait, à condition que vous ayez une version partout, vous devriez être en mesure d'exécuter votre projet sans problèmes


2 commentaires

Merci pour votre réponse. J'ai rétrogradé tous les packages Newtonsoft.Json dans tous les projets, et je semble toujours avoir le même problème, je ne sais pas pourquoi, comme je me suis assuré.


J'ai ajouté quelques éléments à ma réponse, cela devrait vous aider à tout faire fonctionner