340 votes

Avertissement : Conflits trouvés entre différentes versions du même assemblage dépendant

Je développe actuellement une application .NET, qui se compose de 20 projets. Certains de ces projets sont compilés en utilisant .NET 3.5, d'autres sont encore des projets .NET 2.0 (jusqu'à présent, aucun problème).

Le problème est que si j'inclus un composant externe, je reçois toujours l'avertissement suivant :

Des conflits ont été trouvés entre différentes versions d'un même assemblage dépendant.

Que signifie exactement cet avertissement et y a-t-il peut-être une possibilité d'exclure cet avertissement (comme utiliser #pragma disable dans les fichiers de code source) ?

431voto

Brian Low Points 3642

Cet avertissement signifie que deux projets font référence au même assemblage (par exemple System.Windows.Forms ) mais les deux projets nécessitent des versions différentes. Vous avez quelques options :

  1. Recompilez tous les projets pour utiliser les mêmes versions (par exemple, passez tous en .Net 3.5). C'est l'option préférée car tous les codes s'exécutent avec les versions des dépendances avec lesquelles ils ont été compilés.

  2. Ajouter un redirection de liaison . Cela supprimera l'avertissement. Cependant, vos projets .Net 2.0 seront (au moment de l'exécution) liés aux versions .Net 3.5 des assemblages dépendants tels que System.Windows.Forms . Vous pouvez rapidement ajouter une redirection de liaison en double-cliquant sur l'erreur dans Visual Studio.

  3. Utilisez CopyLocal=true . Je ne suis pas sûr que cela supprime l'avertissement. Cela signifiera, comme l'option 2 ci-dessus, que tous les projets utiliseront la version .Net 3.5 de System.Windows.Forms.

Voici quelques moyens d'identifier la ou les références incriminées :

  • Vous pouvez utiliser un utilitaire tel que celui qui se trouve à l'adresse suivante https://gist.github.com/1553265
  • Une autre méthode simple consiste à définir la verbosité de la sortie Build (Tools, Options, Projects and Solutions, Build and Run, MSBuild project build output verbosity, Detailed). Run, MSBuild project build output verbosity, Detailed) et après avoir construction, recherchez l'avertissement dans la fenêtre de sortie, et regardez le résultat de la recherche. juste au-dessus. (Coup de chapeau à pauloya qui l'a suggéré dans les commentaires sur cette réponse) .

9 votes

Juste un moyen rapide de le trouver sans l'utilitaire - si vous ajoutez la redirection de liaison (comme l'option 2), il affichera la ou les références concernées - si vous le souhaitez, vous pouvez alors utiliser l'une des autres méthodes pour le gérer, et supprimer la ou les redirections de liaison de votre fichier de configuration.

237 votes

Le moyen le plus simple de trouver la ou les "références incriminées" est de définir la verbosité de la sortie de la construction (Outils, Options, Projets et solutions, Construire et exécuter, Verbosité de la sortie de la construction du projet MSBuild, Détaillée) et, après la construction, de rechercher l'avertissement dans la fenêtre de sortie. Voir le texte juste au-dessus.

1 votes

Vous pouvez également laisser VS créer la redirection de la liaison, puis utiliser un visualiseur de différences pour voir ce qu'il a ajouté. Cela vous permettra de savoir quelle est la référence incriminée.

45voto

Matt Hamilton Points 98268

En fait, cela se produit lorsque les assemblages auxquels vous faites référence ont l'option "Copy Local" réglée sur "True", ce qui signifie qu'une copie de la DLL est placée dans le dossier bin avec votre exe.

Comme Visual Studio copiera également toutes les dépendances d'un assemblage référencé, il est possible de se retrouver avec deux constructions différentes du même assemblage référencé. Cela est plus susceptible de se produire si vos projets sont dans des solutions distinctes, et peuvent donc être compilés séparément.

La façon dont j'ai contourné ce problème est de définir la valeur False pour Copy Local pour les références dans les projets d'assemblage. Ne le faites que pour les exécutables/applications web où vous avez besoin de l'assemblage pour que le produit fini fonctionne.

J'espère que cela a du sens !

23voto

Gorgsenegger Points 1951

J'ai eu le même problème avec l'un de mes projets, mais aucune des solutions ci-dessus n'a permis de résoudre l'avertissement. J'ai vérifié le fichier journal détaillé de la construction, j'ai utilisé AsmSpy pour vérifier que j'ai utilisé les bonnes versions pour chaque projet dans la solution affectée, j'ai vérifié deux fois les entrées réelles dans chaque fichier de projet - rien n'a aidé.

Finalement, il s'est avéré que le problème était une dépendance imbriquée d'une des références que j'avais dans un projet. Cette référence (A) nécessitait à son tour une version différente de (B) qui était référencée directement depuis tous les autres projets de ma solution. La mise à jour de la référence dans le projet référencé a résolu le problème.

Solution A
+--Project A
   +--Reference A (version 1.1.0.0)
   +--Reference B
+--Project B
   +--Reference A (version 1.1.0.0)
   +--Reference B
   +--Reference C
+--Project C
   +--Reference X (this indirectly references Reference A, but with e.g. version 1.1.1.0)

Solution B
+--Project A
   +--Reference A (version 1.1.1.0)

J'espère que ce qui précède montre ce que je veux dire, cela m'a pris quelques heures pour le découvrir, alors j'espère que quelqu'un d'autre en profitera aussi.

1 votes

Même problème ici. Cependant, je n'ai aucune chance de mettre à jour la référence à une version plus récente. J'ai essayé d'utiliser un App.config : bien que cela fonctionne pour l'application, Visual Studio 2010 semble l'ignorer pendant la construction.

1 votes

Wow, j'ai ces problèmes depuis deux mois et je n'ai pas pu les localiser et les résoudre. Pour une raison quelconque, il se plantait uniquement pendant le débogage et dans certains cas, il remplaçait manuellement le .dll gênant par le vrai dans le dossier bin lorsque cela se produisait. Le débogage était un vrai casse-tête. Quand j'ai lu votre réponse, j'ai réalisé que c'était exactement ce qui m'arrivait et je l'ai résolu en 5 minutes :)

9voto

MoMo Points 5587

Je viens d'avoir ce message d'avertissement et j'ai nettoyé la solution et recompilé (Build -> Clean Solution) et il a disparu.

11 votes

Seulement jusqu'à ce que vous reconstruisiez la solution.

0 votes

Cette solution m'a sauvé ! J'ai essayé d'autres solutions depuis hier mais celle-ci a résolu mon problème. Y compris le commentaire ci-dessus^. Merci !

2voto

Jon Limjap Points 46429

Cela dépend en fait de votre composant externe. Lorsque vous faites référence à un composant externe dans une application .NET, celle-ci génère un GUID pour identifier ce composant. Cette erreur se produit lorsque le composant externe référencé par l'un de vos projets a le même nom, mais une version différente, qu'un autre composant de ce type dans un autre assemblage.

Cela se produit parfois lorsque vous utilisez "Browse" pour trouver des références et que vous ajoutez la mauvaise version de l'assemblage, ou que vous avez une version du composant dans votre dépôt de code différente de celle que vous avez installée sur la machine locale.

Essayez de trouver les projets qui présentent ces conflits, supprimez les composants de la liste de référence, puis ajoutez-les à nouveau en vous assurant que vous pointez vers le même fichier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X