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)?
14 réponses
remplacer "MSBuild project build output verbosity" par "détaillé" ou plus haut. Pour ce faire, suivez les étapes suivantes:
- afficher la boîte de dialogue Options ( Outils -> Options... ).
- 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.
-
dans la page Outils/options qui apparaît, réglez le niveau MSBuild project build output verbosity au réglage approprié selon votre version:
- Diagnostics lors de VS2012, VS2013 ou VS2015 (le message dans ces versions dit vous devez utiliser "détaillé", mais c'est tout à fait erroné, vous devez utiliser "Diagnostics )
- Détaillée "de la 151970920" quand vous êtes sur VS2010
- Normal suffira en VS2008 ou plus.
- 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.
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.
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.
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:
-
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
-
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...
Visual Studio 2013
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"
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
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.
- clic droit sur la solution
- Cliquez Sur Gérer Les Paquets Nuget
- consolide l'onglet et la mise à jour à la même version.
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é...
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 Codeest disponible à: GitHub
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.
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.
la manière la plus simple sans tenir compte des dépendances (internes):
- Ouvrir "Solution Explorer".
- Cliquez sur "Afficher tous les fichiers"
- Développer "Références"
- 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.
- ajouter le référez-vous en arrière et compilez votre code.
- 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.
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é