Monthly Archives: June 2017

Visual Studio for Mac : Error CS0518 / CS0246 en utilisant MSBUILD en ligne de commande

Visual Studio for Mac est disponible en version finale depuis quelques semaines maintenant, et son utilisation en remplacement de Xamarin Studio devient la norme sur bon nombre de projets, notamment ceux qui démarrent maintenant (le risque de faire la transition pouvant être jugé trop important quand vous êtes en phase de finalisation / soumission d’un projet sur les stores).

Parmi les nouveautés de Visual Studio for Mac, se situe la possibilité d’utiliser les projets .NET Standard au sein de vos applications Xamarin, et le fait d’utiliser MSBUILD à la place de XBUILD pour compiler vos projets.

C’est en utilisant cette combinaison qu’un problème très bizarre au premier abord est survenu sur mes environnements de travail. Je vous propose donc un petit retour d’expérience rapide si jamais vous êtes confrontés au même problème.

Alors que mon application compilait sans problème lorsque la solution était ouverte dans Visual Studio for Mac, celle-ci refusait obstinément de compiler en mode ligne de commande en utilisant MSBUILD.

Ce problème se produisait aussi bien sur mon machine de développement que sur le serveur d’intégration continue (TeamCity) sur lesquels l’installation de Visual Studio for Mac avait été réalisée en utilisant la dernière version de l’installeur disponible sur le site de Microsoft.

Sur la machine d’un de mes collègues, le problème ne se produisait pas ce qui me laissait perplexe quant à la source du problème. Les messages d’erreur obtenus par centaines ressemblaient à ceux présentés ci-dessous :

error CS0518: Predefined type 'System.Void' is not defined or imported
error CS0518: Predefined type 'System.String' is not defined or imported
error CS0518: Predefined type 'System.Object' is not defined or imported
error CS0246: The type or namespace name 'Dictionary<,>' could not be found (are you missing a using directive or an assembly reference?)

Après de longues heures de recherche, la source du problème a été identifiée en comparant la configuration de ma machine avec celle sur laquelle cela fonctionnait.

Ci-dessus ma machine sur laquelle cela ne fonctionnait pas et ci-dessous la machine sur laquelle cela fonctionnait sans soucis (celle du développeur qui avait ajouté le projet .NET Standard à la solution).

Comme on peut le voir dans la colonne de gauche de ces écrans, des types de projets supplémentaires dans la section .NET Core apparaissent sur la machine où cela fonctionnait.

En demandant à mon collègue s’il avait fait quelque chose de particulier pour avoir ces types de projets à disposition, la réponse a évidemment été négative et que c’est l’installation de Visual Studio for Mac avait tout fait pour lui sans rien avoir à ajouter.

Même si je ne m’explique toujours que partiellement comment cela pouvait fonctionner dans Visual Studio for Mac et pas en ligne de commande sur ma machine et l’agent TeamCity, la simple installation manuelle de .NET Core SDK sur les 2 machines a résolu la situation et les messages d’erreurs ont disparu lors de la compilation du projet en ligne de commande via MSBUILD.

Pour télécharger et installer .NET Core comme je l’ai fait, il suffit de vous rendre sur cette page.

A noter que j’ai téléchargé une nouvelle fois l’installeur de Visual Studio for Mac sur une machine flambant neuve la semaine dernière, et que le même problème est survenu. Il semble que dans certains cas indéterminés pour l’instant, .NET Core ne soit pas systématiquement installé en même temps que tous les autres composants téléchargés par le programme d’installation.

Advertisements

ITMS-90668 : The executable file contains incomplete bitcode

Comme toute personne qui développe des applications mobiles iOS avec Xamarin, vous utiliserez certainement à un moment donné des SDKs tierces (réseaux sociaux, régies publicitaires, etc…).

Une fois votre application développée, viendra le moment de la soumettre sur l’AppStore et dans la plupart des cas cela fonctionnera sans aucun problème. Mais il arrivera parfois que des soucis surviennent.

C’est ce qui m’est arrivé il y a 15 jours environ pendant la phase de soumission sur l’AppStore, quand j’ai reçu un message d’erreur comme celui visible ci-dessous (cette capture ne correspond pas à mon application mais la source d’erreur est la même).

Ce message indique qu’un SDK utilisé dans l’application pose un souci car il contient un “bitcode incomplet” alors que très probablement d’autres SDKs dans la même application utilisent pour leur part un bitcode complet. Apple refuse apparemment d’accepter les applications qui mixent les deux.

Après de multiples recherches sur Internet qui traitent dans la majorité des cas de la résolution de cette erreur pour les gens travaillant sur Xcode, je suis tombé sur cette page sur l’outil de suivi de bugs de Xamarin qui fait état d’un problème connu.

La solution de contournement (workaround / fix) évoqué dans le ticket fonctionne parfaitement.

Pour cela, il suffit d’éditer le fichier .csproj de votre application Xamarin.iOS et d’ajouter les lignes suivantes à la fin, juste avec la balise </project> :

<Target Name="BeforeCodesign">
  <Exec Command="$(_SdkDevPath)\Toolchains\XcodeDefault.xctoolchain\usr\bin\bitcode_strip -r %(_Frameworks.FullPath) -o %(_Frameworks.FullPath)" />
</Target>

Ces quelques lignes permettent de supprimer tout le bitcode inutiles des SDKs embarqués dans votre application au moment où celle-ci est compilée et juste avant d’appliquer la signature du package.

Une fois ces quelques lignes ajoutées et l’application recompilée, la soumission sur l’AppStore ne devrait plus poser aucun souci.