Dot.Blog

C#, XAML, Xamarin, UWP/Android/iOS

Xamarin.Forms : N’utilisez pas “Android” dans vos espaces de noms…

Une erreur courante qui semble pourtant partir d’une bonne idée : mettre “Android” dans le nom d’un projet voué à cette plateforme dans une solution multiplateforme. Beaucoup ont essayé mais ils ont eu des problèmes… Lesquels ?

L’enfer est pavé de bonnes intentions

Vous créez une solution cross-plateforme, disons au minimum une cible iOS et une cible Android. Pour clarifier les choses vous allez suffixer vos différents projets avec le nom de la plateforme cible. Le projet pour Android se terminera donc par un “.Android”. Propre, net. Rien à dire.

…Si hélas, il y a dire car cette action innocente et pétrie de bonnes intentions va créer des problèmes !

Les conflits d’espaces de noms vont arriver très vite et vous ne saurez plus comment vous en sortir !

Nom de projet et Espace de noms du projet

Lorsque vous créez un projet Xamarin.Forms peut-être avez-vous remarqué que le nom du projet et celui de l’espace de noms ne sont pas tout à fait identiques… Pour l’App37 (37ème nom par défaut automatiquement donnée par VS !), vous aurez ainsi :

image


Ca c’est quand VS crée la solution tout seul… Le template pour un projet Xamarin.Forms a été conçu par l’équipe qui connaissait le danger et les noms attribués sont là pour éviter la fameuse erreur…

Mais si la création du projet est manuelle, si c’est vous qui attribuez les noms il est fort probable que vous ne fassiez pas attention à ce problème, par ignorance et non par négligence d’ailleurs.

Et c’est là que les ennuis vont commencer…

Imaginons que lors de la création d’un projet Xamarin pour Android vous saisissiez le nom (très original) “MyApp.Android”.

Si vous ouvrez les paramètres vous verrez ceci :

image

Gasp ! Horreur, malheur et putréfaction !

Les deux noms sont identiques.

La compilation qui fait peur

Compilez… allez-y, ne soyez pas timide, il faut boire le calice jusqu’à la lie…

image

Aie !

Le problème ici est que votre espace de noms a maintenant un conflit avec chaque espace de noms des bibliothèques Android principales !

Solution

Bon vous l’avez compris, le mieux c’est de ne pas utiliser le suffixe “Android” dans le nom de vos projets ou en tout cas de pensez à modifier l’espace de noms par défaut en utilisant plutôt le suffixe “.Droid” qui est bien assez clair pour différencier la plateforme cible du projet.

Mais imaginons que vous avez commis l’erreur fatale. Comment s’en sortir sans tout mettre à la poubelle et avoir à recommencer ?

  • Premièrement changez l’espace de noms par défaut de votre projet et utilisez “.Droid” au lieu de “.Android”.
  • Ensuite voyagez dans tous vos sources et changer à la main les références à l’ancien espace de noms (“.Android” devenant “.Droid”). Certains outils comme ReSharper doivent pouvoir aider à ce type de refactoring.
  • Mais ce n’est pas fini… Il faut maintenant faire un nettoyage du projet (je conseil carrément une destruction des sous-répertoires “bin” et “obj” c’est le plus sûr.
  • Enfin, faites une reconstruction du projet et assurez-vous que le fichier Resources.designer.cs a bien été regénérer pour refléter fidèlement votre modification…

Et normalement c’est tout bon !

Conclusion

Si cette erreur se règle assez facilement, si elle a des effets très visibles (donc difficile de la louper), sa cause n’est pas évidente pour tout le monde et peut laisser un développeur perplexe pendant un bon moment…

Gagnez du temps en faisant les choses correctement des le début, mais encore faut-il le savoir… C’est pourquoi la meilleure façon de gagner du temps, c’est… De lire Dot.Blog !

Stay Tuned !

blog comments powered by Disqus