Résoudre MSB3247-conflits trouvés entre différentes versions de la même assemblée dépendante

A. Une solution .NET 3.5 a fini avec cet avertissement lors de la compilation avec msbuild.

parfois NDepend peut aider mais dans ce cas, il ne donne pas plus de détails. comme Bob j'ai fini par devoir recourir à l'ouverture de chaque assemblage dans ILDASM jusqu'à ce que je trouve celui qui faisait référence à une version plus ancienne de l'assemblage dépendant.

j'ai essayé D'utiliser MSBUILD de VS 2010 Beta 2 (comme L'article Connect l'a indiqué a été fixé dans la prochaine version de la CLR), mais qui n'a pas fourni plus de détails non plus (peut-être fixe Post Beta 2)

Est-il mieux (en plus automatisées)?

409
demandé sur AMissico 2009-12-09 04:28:07

14 réponses

remplacer "MSBuild project build output verbosity" par "détaillé" ou plus haut. Pour ce faire, suivez les étapes suivantes:

  1. afficher la boîte de dialogue Options ( Outils -> Options... ).
  2. dans l'arbre de gauche, sélectionnez le Projects and Solutions node, puis sélectionnez Build and Run .
    • Note: si ce noeud n'apparaît pas, assurez-vous que le la case à cocher en bas de la boîte de dialogue afficher tous les paramètres est cochée.
  3. dans la page Outils/options qui apparaît, réglez le niveau MSBuild project build output verbosity au réglage approprié selon votre version:

  4. construisez le projet et regardez dans la fenêtre de sortie.

vérifiez les messages MSBuild. La tâche ResolveAssemblyReferences , qui est la tâche dont MSB3247 provient, devrait vous aider à déboguer cette question particulière.

mon cas particulier était une référence incorrecte à SqlServerCe. Voir ci-dessous. J'ai eu deux projets faisant référence à deux versions différentes de SqlServerCe. Je suis allé au projet avec l'ancienne version, j'ai enlevé la référence, puis j'ai ajouté la référence correcte.

Target ResolveAssemblyReferences:
    Consider app.config remapping of assembly "System.Data.SqlServerCe, ..." 
        from Version "3.5.1.0" [H:\...\Debug\System.Data.SqlServerCe.dll] 
        to Version "9.0.242.0" [C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\PublicAssemblies\System.Data.SqlServerCe.dll]
        to solve conflict and get rid of warning.
    C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets : 
        warning MSB3247: Found conflicts between different versions of the same dependent assembly.

il n'est pas nécessaire d'ouvrir chaque assemblage pour déterminer versions des assemblages référencés.

  • vous pouvez vérifier les propriétés de chaque référence.
  • ouvrir les propriétés du projet et vérifier les versions de la section Références.
  • ouvrez les projets avec un éditeur de texte.
  • Utiliser Un Réflecteur.
562
répondu AMissico 2017-05-23 10:31:30

Mike Hadlow a posté une petite application de console appelée AsmSpy qui énumère assez bien les références de chaque assemblée:

Reference: System.Net.Http.Formatting
        4.0.0.0 by Shared.MessageStack
        4.0.0.0 by System.Web.Http

Reference: System.Net.Http
        2.0.0.0 by Shared.MessageStack
        2.0.0.0 by System.Net.Http.Formatting
        4.0.0.0 by System.Net.Http.WebRequest
        2.0.0.0 by System.Web.Http.Common
        2.0.0.0 by System.Web.Http
        2.0.0.0 by System.Web.Http.WebHost

C'est une façon beaucoup plus rapide d'aller au fond de L'avertissement MSB3247, que de dépendre de la sortie MSBuild.

127
répondu Noel Abrahams 2017-09-21 03:25:28

j'ai trouvé que (au moins dans Visual Studio 2010) vous avez besoin de mettre la verbosité de sortie au moins détaillé pour être en mesure de repérer le problème.

il se peut que mon problème ait été une référence qui était auparavant une référence GAC, mais ce n'était plus le cas après la réinstallation de ma machine.

21
répondu ErikHeemskerk 2010-06-16 14:59:45

parfois @AMissico réponse n'est pas suffisant. Dans mon cas, je n'ai pas pu trouver l'erreur dans la sortie windows donc j'ai décidé de créer un fichier log et de l'analyser, en faisant les étapes suivantes:

  1. Enregistrer le journal de construction dans un fichier... https://msdn.microsoft.com/en-us/library/ms171470.aspx

    msbuild MyProject.proj /fl /flp:logfile=MyProjectOutput.log;verbosity=detailed

  2. trouver le texte: warning MS... ou le avertissement spécifique: (par exemple ligne 9293) Found conflicts between different versions... et tous les détails de l'erreur de conflit seront au-dessus de ce message (par exemple ligne 9277) There was a conflicts between... Find the error message

Visual Studio 2013

18
répondu Jaider 2016-11-29 20:37:58

cet avertissement généré par défaut ASP.NET MVC 4 Bêta voir ici

In, tout cast cet avertissement peut être éliminé en éditant manuellement le .fichier csproj pour votre projet.

modifier........: Reference Include= " System.Net."

à lire ......: Référence Incluent="Le Système De.Net.Http, Version=4.0.0.0"

7
répondu RouR 2012-04-25 09:02:45

Utiliser une dépendance reader

utilisant dep.exe vous pouvez énumérer toutes les dépendances imbriquées d'un dossier entier. Combiné avec des outils unix comme grep ou awk, il peut vous aider à résoudre votre problème

pour Trouver des assemblages d'être référencé dans plus d'une version

$ dep | awk '{ print  " " ; print  " "  }' | awk '{ if (length(versions[]) == 0) versions[] = ; if (versions[] != ) errors[] = ; }  END{ for(e in errors) print e } ' 
System.Web.Http            

cette ligne de commande obscure exécute dep.exe pipes ensuite la sortie deux fois à awk à

  • mettre le parent et l'enfant dans une seule colonne (par défaut, chaque ligne contient un parent et un enfant pour exprimer le fait que ce parent dépend de l'enfant)
  • puis faire une sorte de 'group by' en utilisant un tableau associatif

comprendre comment cette assemblée a été tirée dans votre poubelle

$ dep myproject/bin | grep -i System\.Web\.Http
MyProject-1.0.0.0 >> System.Web.Http.Web-5.2.3.0 2 ( FooLib-1.0.0.0 )
MyProject-1.0.0.0 >> System.Web.Http.Web-4.0.0.0 2 ( BarLib-1.0.0.0 )
FooLib-1.0.0.0 > System.Web.Http.Web-5.2.3.0 1
BarLib-1.0.0.0 > System.Web.Http.Web-4.0.0.0 1 

dans cet exemple, l'outil vous montrerait ce système.Web.Http 5.2.3 vient de votre dépendance à Fotub alors que la version 4.0.0 vient de BarLib.

alors vous avez le choix entre

  • convaincre les propriétaires de la libs d'utiliser la même version
  • stop à l'aide de l'un d'eux
  • ajouter des redirections de reliure dans votre fichier de configuration pour utiliser la dernière version

Comment faire pour exécuter ces chose dans Windows

si vous n'avez pas de shell unix, vous besoin de télécharger un avant de pouvoir exécuter awk et grep . Essayez l'un des suivants

6
répondu Manitra Andriamitondra 2016-01-07 05:08:23

j'ai eu la même erreur et je n'ai pas pu la comprendre avec les autres réponses. J'ai trouvé que nous pouvons "consolider" les paquets NuGet.

  1. clic droit sur la solution
  2. Cliquez Sur Gérer Les Paquets Nuget
  3. consolide l'onglet et la mise à jour à la même version.
5
répondu Carol 2017-02-19 22:08:22

j'ai eu ce problème aussi et j'ai utilisé les conseils D'AMissico trop découvrir le problème (bien qu'a dû mettre le niveau de verbosité à détaillé.

le problème était en fait assez simple, mais après avoir trouvé le coupable.

arrière-plan: J'ai amélioré mon projet de VS2008 à VS2010. En VS2008, le cadre cible était de 3,5 et lorsque je l'ai introduit dans VS2010, Je l'ai remplacé par 4 (complet). J'ai également amélioré certains composants tiers, y compris Crystal rapport.

il s'est avéré la plupart des références de système où pointant vers la version 4.0.0.0 mais un couple n'avait pas été changé automatiquement (système et système.Web.Services) et étaient toujours à la recherche de 2.0.0.0. Crystal reports fait référence à 4.0.0.0 et c'est donc là que les conflits se produisaient. Il suffit de placer le curseur sur la première bibliothèque système dans l'Explorateur de solutions, de pointer vers le bas de la liste et de chercher des références à 2.0.0.0, en supprimant et en rajoutant de nouveaux 4.0.0.0 version a fait le tour.

l'étrange c'était que la plupart des références avaient été correctement mises à jour et si ce N'était pas Crystal reports, Je n'aurais probablement jamais remarqué...

4
répondu Hamiora 2010-11-02 17:15:31

j'ai fait une demande basée sur Mike Hadlow demande: AsmSpy .

Mon app est une application WPF avec une interface graphique et peut être télécharger à partir de mon propre serveur web: AsmSpyPlus.exe .

Le Code

est disponible à: GitHub

Gui Sample

2
répondu Eric Ouellet 2015-09-17 09:57:43

Comme mentionné ici , vous devez supprimer les références inutiles et les avertissements aller.

2
répondu lex87 2018-08-09 23:32:52

ASP.NET build manager construit le site Web en parcourant les dossiers par ordre alphabétique, et pour chaque dossier il calcule les dépendances et construit les dépendances d'abord et ensuite le dossier sélectionné.

dans ce cas le dossier problématique qui est ~ / Controls, est sélectionné pour être construit au début, pour une raison encore inconnue, il construit quelques-unes des commandes là comme un assemblage séparé au lieu d'à l'intérieur du même assemblage que d'autres commandes (semble être relié au fait que certains contrôles dépendent d'autres contrôles dans le même dossier).

puis le dossier suivant qui est construit (~/File-Center/Control) dépend du dossier racine ~/ qui dépend de ~/Controls, donc le dossier ~/Controls est construit de nouveau seulement cette fois les contrôles qui ont été séparés à leur propre assemblage sont maintenant joints au même assemblage que les autres contrôles avec l'assemblage séparé étant toujours référencés.

donc à ce point 2 l'assemblage (au moins) ont les mêmes commandes et la construction échoue.

bien que nous ne sachions toujours pas pourquoi cela s'est produit, nous avons pu contourner cela en changeant le nom du dossier des commandes en ZControls, de cette façon il n'est pas construit avant ~/File-Center/Control, seulement après et de cette façon il est construit comme il se doit.

1
répondu Mike Yinger 2011-04-29 21:05:01

Quick Fix:

clic droit sur solution -> Gérer les paquets NuGet pour solution -> sous consolider vous pouvez voir s'il y a différentes versions du même paquet qui ont été installées. Désinstallez différentes versions et installez la dernière.

1
répondu JerryGoyal 2017-09-05 06:08:30

la manière la plus simple sans tenir compte des dépendances (internes):

  1. Ouvrir "Solution Explorer".
  2. Cliquez sur "Afficher tous les fichiers"
  3. Développer "Références"
  4. vous verrez une (ou plusieurs) référence(s) avec une icône légèrement différente du reste. Généralement, c'est avec la boîte jaune vous propose de prendre en note. Suffit de le retirer.
  5. ajouter le référez-vous en arrière et compilez votre code.
  6. C'est tout.

dans mon cas, il y avait un problème avec la référence MySQL. D'une façon ou d'une autre, je pourrais en énumérer trois versions sous la liste de toutes les références disponibles. J'ai suivi le processus 1 à 6 ci-dessus et ça a fonctionné pour moi.

0
répondu Sukhi 2014-06-16 00:00:34

de Visual Studio pour la Communauté Mac plus:

comme la réponse D'AMissico nécessite de changer le niveau de log, et ni ASMSpy ni ASMSpyPlus sont disponibles comme une solution multiplateforme, voici un petit ajout pour Visual Studio pour Mac:

https://docs.microsoft.com/en-us/visualstudio/mac/compiling-and-building

C'est dans Visual Studio Community → Préférences... → Projets → construire un journal → verbosité

0
répondu SwiftArchitect 2018-05-15 02:10:42