Utiliser des librairies C++/CX dans Windows Phone, c’est swag !

L’ajout de components C++/CX dans un projets Windows Phone en C# permet d’associer la puissance du C++/CX à la facilité d’utilisation du C#.

C’est bon, c’est frais, c’est swag.

L’intégration de ces librairies s’effectue comme un assembly .NET classique.
Il suffit d’ajouter une référence pointant vers le fichier d’extension « .winmd » de la librairie.
Ce fichier permet de faire le lien entre notre projet et la dll C++/CX et contient des métadatas (comme son extension le laisse deviner).

Exemple avec la librairie MOGA

L’API MOGA permet de connecter à votre application une manette de jeu bluetooth.
J’ai personnellement testé le modèle Moga HERO (gentiment prêté par Mr. Alex Danvy).

Pour intégrer l’API Moga, on doit ajouter la référence à sa librairie, le fichier « Moga.Windows.Phone.winmd ».

AddReferenceMoga

Une fois référencé on peut regarder le chemin de la librairie dans la fenêtre propriétés de la référence.

MogaProperties

Le chemin qui pointe vers cette librairie contient un dossier ARM.

Lorsque l’on lance notre application en mode « Device » tout se passe bien mais dès que nous changeons la cible vers un de nos émulateurs, le compilateur nous assène un message peut avenant :

« There was a mismatch between the processor architecture of the project being built « x86 » and the processor architecture, « ARM », of the implementation file « D:\Sam\WP8\PurpleCherryX\Librairies\Moga\ARM\Moga.Windows.Phone.dll » for « D:\Sam\WP8\PurpleCherryX\Librairies\Moga\ARM\Moga.Windows.Phone.winmd ». This mismatch may cause runtime failures. Please consider changing the targeted processor architecture of your project through the Configuration Manager so as to align the processor architectures between your project and implementation file, or choose a winmd file with an implementation file that has a processor architecture which matches the targeted processor architecture of your project. »

Vilain !

A contrario d’une application .NET, les libraries sont compilées pour une cible particulière:

  • – ARM pour un téléphone.
  • – X86 pour un émulateur.

Si on regarde au même niveau d’arborescence que le dossier ARM contenant la librairie Moga, vous trouverez également un dossier x86.
C’est toujours le cas pour les librairies C++/CX.

On va donc tout simplement enlever la référence actuelle de la librairie MOGA ARM pour la remplacer par celle contenue dans le dossier x86.

Voila ça compile maintenant !

Sauf que…

Lorsque je repasse la cible de compilation en « Device » l’erreur revient mais dans l’autre sens.

Si vous êtes de nature patiente et guillerette vous allez changer de nouveau la référence de la librairie pour la faire pointer vers le dossier ARM (ou x86 selon le cas) autant de fois que nécessaire.

Pour ma part, qui suis plutôt du type de nature illustré ci-dessous, j’ai préféré la solution expliquée en détail dans le prochain paragraphe.

Angoisse

Tout est bien qui finit bien

Oyez l’amis !
Voici donc la solution qui te permettra de continuer le développement tout en restant sain d’esprit.
Il existe sans doute d’autre façon de faire, alors n’hésitez pas à commenter l’article !

Tout d’abord on se rend dans le répertoire de notre application en effectuant dans Visual Studio un bouton droit de la souris sur le projet C# puis « Open folder in file explorer ».

Dans ce dossier, on cherche le fichier du projet en cours « MonProjet.csproj » que l’on ouvre avec un gros Notepad.

A l’intérieur, on recherche la référence à notre fichier « Moga.Windows.Phone.winmd » qui nous conduit vers une une balise « HintPath ».

    <Reference Include="Moga.Windows.Phone, Version=255.255.255.255, Culture=neutral, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\Librairies\Moga\ARM\Moga.Windows.Phone.winmd</HintPath>
    </Reference>

Dans la balise « HintPath », on remplace le dossier ARM (ou x86 selon votre référence) par la variable « $(Platform) » qui rendra le chemin dynamique selon le type de cible visé (ARM ou x86)

    <Reference Include="Moga.Windows.Phone, Version=255.255.255.255, Culture=neutral, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\Librairies\Moga\$(Platform)\Moga.Windows.Phone.winmd</HintPath>
    </Reference>

On enregistre, puis on recharge le projet et le tour est joué !

leave your comment