Comment résoudre l'erreur "Current solution contains incorrect mappings." avec Visual Studio ?
Peut-être avez-vous déjà été confronté à un bandeau présent dans la parti haute de Visual Studio, et affichant le message :
Current solution contains incorrect configurations mappings. It may cause projects to no work correctly. Open Configuration Manager to fix them.
Si tout se passe bien, le projet concerné est mis en évidence par un pictogramme d'avertissement affiché devant le nom du projet :
Dans le cas où vous ne disposez que de projets .net aux anciens formats :
- le message ne sera pas visible.
- le projet à problèmes ne sera pas mis en évidence.
- lors de la compilation msbuild devrait remonter un message impliquant un problème de mapping.
Quel est le problème?
L'erreur remontée ici par Visual Studio concerne la gestion des configurations, et plateformes. Un ou plusieurs projets sont mal configurés. Le lien entre les configurations des projets, et celles de la solution ne se fait pas.
De ce fait, il est possible que certains projets ne soient pas compilés avec la configuration, et la plateforme courante.
Comment s'en sortir ?
Si vous suivez les indications, vous n'irez pas loin. Vous vous retrouverez la boite de dialogue configuration manager, et ensuite ?
Pas de panique, je suis là pour vous accompagner. Je vais vous présenter une approche qui fonctionne dans 100% des cas. Celle-ci tient en quatre étapes :
- Supprimer facilement les configurations en trop.
- Supprimer facilement les plateformes en trop.
- Rectifier les projets.
- Rectifier la solution.
Par habitude, on garde souvent de très nombreuses plateformes alors que l'on n'en compile toujours qu'une. Personnellement, j'ai pris l'habitude inverse : ne garder qu'un profile.
Dans le cas présent, je vous propose d'opter pour la stratégie suivante :
- Ne conserver que les configurations Debug et Release.
- Ne conserver que le profile Any CPU au niveau de la solution
- Seuls les exécutables cibleront x86 ou x64 (site web, consoles .. Etc)
De la sorte aucun développeur ne s'emmêlera les pinceaux avec les profils. L'erreur de mapping sera d'autant plus facile à résoudre.
Supprimer facilement les configurations en trop
Commençons donc par utiliser Configuration Manager pour faire le ménage. Pour rappel, celui-ci se cache dans le menu Configuration.
À partir de l'écran Configuration Manager, il convient d'ouvrir la liste déroulante des Configurations, et de sélectionner "Edit".
Ceci permet d'afficher la boite de dialogue dédiée à la gestion des configurations. Avant de toucher à quoi que ce soit, il faut cocher la case "Remove deleted configuration from all projects where it is unused". Ensuite on peut supprimer les configurations qui n'ont plus d'intérêt.
Supprimer facilement les plateformes en trop.
Après validation de la liste des configurations, on peut maintenant s'occuper des environnements. Cela passe à nouveau par la boite de dialogue Configuration Manager. Cette fois si, il faut choisir l'option Edit présente en fin de liste des plateformes.
Ici aussi, avant de faire quoi que ce soit, il faut penser à cocher l'option "Remove deleted platforms from all projects where it is unused". On peut ensuite supprimer les plateformes qui ne seraient pas utiles.
En peu enfin fermer Configuration Manager, et enregistrer les fichiers modifiés par Visual Studio. Il peut y avoir quelques projets, en plus du fichier de la solution.
Rectifier les projets
On peut maintenant s'attaquer aux projets. L'idée ici, est de limiter ceux-ci au strict minimum. On en profite donc pour ne garder que là où les plateformes utiles (AnyCPU, x86, x64…).
Exemple pour un projet qui n'est compilé qu'en 64 bits, je limite la liste des profiles :
<Platforms>x64</Platforms>
<Platform>x64</Platform>
Rectifier la solution
Pour finir, il ne nous reste plus qu'à nettoyer la solution. Pour cela, il vous faudra ouvrir le fichier sln avec l'éditeur de votre choix.
Pour commencer, il faut trouver l'id du projet en défaut. Celui-ci se trouve en début de fichier, en toute fin de ligne.
Exemple pour un projet portant le nom MonProjet
, l'id est {A3307DAA-4B1F-4D05-B465-9F82DB3D0034}
.
Project("{.....}") = "MonProjet", "Mondossier\MonProjet.csproj", "{A3307DAA-4B1F-4D05-B465-9F82DB3D0034}"
EndProject
Cet id devrait se retrouver sur quatre lignes similaires à ceci :
{A3307DAA-4B1F-4D05-B465-9F82DB3D0034}.Debug|Any CPU.ActiveCfg = Debug|x86
{A3307DAA-4B1F-4D05-B465-9F82DB3D0034}.Debug|Any CPU.Build.0 = Debug|x86
{A3307DAA-4B1F-4D05-B465-9F82DB3D0034}.Release|Any CPU.ActiveCfg = Release|x86
{A3307DAA-4B1F-4D05-B465-9F82DB3D0034}.Release|Any CPU.Build.0 = Release|x86
S’il y a plus de lignes, ce n'est pas normal. Il doit y avoir deux lignes par configuration. L'une indique la configuration à activer, l'autre la configuration à utiliser s’il faut compiler le projet (si le projet n'est pas compilé, la ligne xxx.Build.0 est donc absente).
Dans le cadre de mon exemple, le nombre de lignes est bon. Par contre, lors de la compilation ciblant Any CPU, le sln cherche à utiliser une plateforme x86 qui n'existe pas dans le projet. Pour corriger le fichier sln, il suffit donc d'indique la plateforme x64.
{...}.Debug|Any CPU.ActiveCfg = Debug|x64
{...}.Debug|Any CPU.Build.0 = Debug|x64
{...}.Release|Any CPU.ActiveCfg = Release|x64
{...}.Release|Any CPU.Build.0 = Release|x64
Et voilà.