434 votes

Résolution de MSB3247 - Conflits trouvés entre différentes versions d'un même assemblage dépendant

Une solution .NET 3.5 s'est retrouvée avec cet avertissement lors de la compilation avec msbuild.

Parfois, NDepend peut aider, mais dans ce cas, il n'a pas donné de détails supplémentaires. Comme Bob J'ai fini par devoir ouvrir chaque assemblage dans ILDASM jusqu'à ce que je trouve celui qui faisait référence à une ancienne version de l'assemblage dépendant.

J'ai essayé d'utiliser MSBUILD à partir de VS 2010 Beta 2 (comme l'article de Connect indiquait que cela était corrigé dans la prochaine version du CLR) mais cela n'a pas fourni plus de détails non plus (peut-être corrigé après la Beta 2).

Existe-t-il une meilleure approche (plus automatisée) ?

585voto

AMissico Points 12837

Changez la "verbosité de la sortie de construction du projet MSBuild" à "détaillée" ou plus. Pour ce faire, suivez les étapes suivantes :

  1. Faites apparaître la boîte de dialogue Options ( Outils -> Options... ).
  2. Dans l'arborescence de gauche, sélectionnez le Projets et solutions puis sélectionnez Construire et exécuter .
    • Remarque : si ce nœud ne s'affiche pas, assurez-vous que la case à cocher en bas de la boîte de dialogue Afficher tous les paramètres est vérifié.
  3. Dans la page d'outils/options qui s'affiche, définissez les paramètres suivants verbosité de la sortie de construction du projet MSBuild niveau pour Détaillé (en supposant que vous êtes sur VS2010 ; Normal suffira dans VS2008 ou plus ancien).
  4. Construisez le projet et regardez dans la fenêtre de sortie.

Vérifiez les messages de MSBuild. Le site ResolveAssemblyReferences qui est la tâche d'où provient MSB3247, devrait vous aider à déboguer ce problème particulier.

Mon cas spécifique était une référence incorrecte à SqlServerCe. Voir ci-dessous. J'avais deux projets faisant référence à deux versions différentes de SqlServerCe. Je suis allé dans le projet avec l'ancienne version, j'ai supprimé 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 les versions des assemblages référencés.

  • Vous pouvez vérifier les propriétés de chaque référence.
  • Ouvrez les propriétés du projet et vérifiez les versions de la section Références.
  • Ouvrez les projets avec un éditeur de texte.
  • Utilisez .Net Reflector.

140voto

Noel Abrahams Points 3678

Mike Hadlow a a posté une petite application de console appelée AsmSpy. qui liste assez joliment les références de chaque assemblage :

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 un moyen beaucoup plus rapide d'aller au fond de l'alerte MSB3247, que de dépendre de la sortie de MSBuild.

21voto

ErikHeemskerk Points 1048

J'ai constaté que (au moins dans Visual Studio 2010) vous devez définir la verbosité de sortie à au moins Detailed pour être en mesure de repérer le problème.

Il se peut que mon problème soit dû à 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.

7voto

RouR Points 1255

Cet avertissement est généré pour la version bêta d'ASP.NET MVC 4. voir ici

En, tout cast this Warning peut être éliminé en éditant manuellement le fichier .csproj de votre projet.

modifier........ : Référence Include="System.Net.Http"

pour lire ...... : Référence Include="System.Net.Http, Version=4.0.0.0"

4voto

Hamiora Points 171

J'ai eu ce problème aussi et j'ai utilisé les conseils d'AMissico pour découvrir le problème (bien qu'il ait fallu mettre le niveau de verbosité à Detailed.

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

Le contexte : J'ai mis à jour mon projet de VS2008 à VS2010. Dans VS2008, le cadre cible était 3.5 et lorsque je l'ai introduit dans VS2010, je l'ai fait passer à 4 (complet). J'ai également mis à niveau certains composants tiers, notamment Crystal Reports.

Il s'est avéré que la plupart des références du système pointaient vers la version 4.0.0.0, mais que certaines n'avaient pas été modifiées automatiquement (System et System.Web.Services) et étaient toujours en version 2.0.0.0. Crystal Reports fait référence à la version 4.0.0.0 et c'est donc là que les conflits se produisent. Il suffit de placer le curseur sur la première bibliothèque System dans l'explorateur de solutions, de parcourir la liste et de rechercher toutes les références à la version 2.0.0.0, de supprimer et de réinsérer la version 4.0.0.0 plus récente.

Le plus étrange, c'est que la plupart des références avaient été correctement mises à jour et que, sans les rapports Crystal, je ne l'aurais probablement jamais remarqué...

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