Mon application Todo avec Xamarin en .NET Standard

Nous avons vu que l'application des Samples du Forum, le projet Todo est de la forme "Bibliothèque de classes portables" qui ne doit plus être utilisé aujourd'hui. Nous allons donc tout naturellement faire ce petit projet de créer la même application en partant d'un projet de type ".NET Standard".

C'est une bonne façon de mettre la main à la pâte, le pied à l'étrier.

Création du projet Todo avec .NET Standard

Classiquement je fais : Fichier -> Nouveau -> Projet
Visual Studio : Fichier -> Nouveau projet
Visual Studio : Fichier -> Nouveau projet

Dans la liste des Templates : Xamarin.Forms
Todo Application mobile (Xamarin.Forms)
Todo Application mobile (Xamarin.Forms)
Je choisie le Template "Master Detail" c'est toujours plus sympa d'avoir un menu et je prends bien sûr l'option ".NET Standard" :



Xamarin Todo .NET Standard
Xamarin Todo .NET Standard

Installation du Nuget sqlite-net-pcl

Pour travailler avec une base de donnée comme dans le projet Todo des Samples Xamarin on installe le nuget "sqlite-net-pcl".

Je note que le projet Template Master Detail est configuré avec le pattern MVVM alors que le projet Todo ne l'est pas, il est en "code behind". C'est une nouvelle bonne raison de faire évoluer ce projet.

Couche de données

Répertoire Data dans Todo Sample :

Couche de Data dans Todo
Dans mon nouveau projet .NET Standard :


Couche Data dans mon projet
Je conserve l'Interface c'est bien plus propre. Elle demande aux objets qui en dérivent d'implémenter des fonctions asynchrones de gestion des éléments dans la liste.

L'objet database : SQLiteAsyncConnection est implémenter dans MockDataStore :



Code Database
Code Database
L'objet Database est instancié au démarrage de l'application dans App.xaml.cs.

Création de la Base de données SQLite

Complétion de la méthode OnAppearing pour afficher la liste des Items :

Todo Sample vs Todo modèle .NET Standard

Pour la couche de données c'est quasiment terminé, il suffit de continuer à procéder.

Exécution du projet

J'exécute ce projet sur l'émulateur Android Accelerated Nougat 7.1 API25, voici le résultat de l'exécution :
Exécution de mon Projet Todo en .NET Standard
Vous pouvez voir les deux Items que j'ai créé et qui sont maintenant dans la base de données SQLite.
De mon côté, je vais poursuivre le CRUD des cette liste de Todo afin de terminer ce projet.

Gestion de configuration avec Github

Ce projet est connecté dans mon Repo Github je fais donc un petit Push pour livrer .


Push dans Github

C'est ainsi que les sources de ce projet sont accessibles à l'adresse suivante :

Todo Sample en .NET Standard sous Github
Todo Sample en .NET Standard sous Github
https://github.com/mabyre/Xamarin

Voilà tout est prêt pour démarrer le développement de nouvelles applications avec Xamarin.

Have fun !

Xamarin .NET Standard - Template Master Detail vs Tabbed

Quel sont les différents modèles proposés par le développement d'application avec Xamarin. On a vue les trois choix d'architectures, .NET Standard, Partagé et Bibliothèque partageable sachant que ce dernier est à oublier. Maintenant il existe deux types de templates de projet "Master Detail" et "Tabbed" comment fonctionnent-ils ?

Projet Xamarin "Tabbed"

Le Front de l'application :

Xamarin Template project Tabbed
Xamarin Template project Tabbed

Les deux onglets sont positionnés l'un à côté de l'autre. Si je clique sur "ABOUT" :

Xamarin Template project Tabbed
Xamarin Template project Tabbed - Onglet About

Et en revenant sur Browse et en cliquant sur Add je peux ajouter un item :

Xamarin Template project Tabbed - Add
Xamarin Template project Tabbed - Add
Voilà pour cette présentation du Template d'application Xamain "Tabbed" ...

Projet Xamarin "Master Detail"

C'est tout simple dans la description mais il faudrait voir également comment cela se passe dans le code pour obtenir et gérer ce menu.

Le front de l'application Template Master Detail :

Xamarin Master Detail Template
Xamarin Master Detail Template
On voit un menu et non plus les deux onglets côte à côte. En cliquant sur ce menu :


Xamarin Master Detail Template - Menu
Xamarin Master Detail Template - Menu
En cliquant sur l'article "About" :

Mater Detail - About
Mater Detail - About
Puis en revenant sur Browse et en cliquant sur Add :

Mater Detail - Add
Mater Detail - Add
On voit un bouton CANCEL qui est en plus et qui pourrait pourtant être aussi dans le Template "Tabbed" ...

Exo Simple : Ajouter un bouton "Cancel" sur le front de l'application "Tabbed" comme pour l'application "Master Detail". C'est vraiment très simple mais cela permet de jouer un peu avec les xmal et les events liés

Conclusion

Le Template "Master Detail" possède un objet en plus : le Menu, il est sans doute plus pratique pour une plus grosse application qui serait amenée à s'étendre.

Don't forget to have fun! It's only software!


Architecture des applications multiplateformes avec Xamarin

Vous aimeriez vous y retrouver parmi toutes les possibilités de développer des applications cross-plateformes avec Xamarin Bibliothèques .NET standard, Projets partagés, Bibliothèques de classes portables (déconseillé), moi aussi !

Alors je prends note pour tenter d'obtenir rapidement une vision qui mène vers le bon chemin. On veut laisser derrières les solutions qui ne fonctionnent pas et il y en a et trouver de quoi sera fait Xamarin demain ...

Xamarin Bibliothèque de classes portables
Xamarin Bibliothèque de classes portables

Déjà on peut plaindre ceux qui ont utilisé ce truc la ce serait déconseillé. Je n'aime pas du tout cette façon de faire en déconseillant pourquoi puisque c'est toujours là !

C'est d'autant plus du grand n'importe quoi que les exemples sont pléthoriques :

Bibliothèques de classes portables (PCL)

Développement interplateforme avec la bibliothèque de classes portable

Étant donné que les projets de bibliothèque de classes Portable ciblent uniquement un sous-ensemble très spécifique des implémentations de .NET, nous déconseillons fortement leur utilisation dans le développement de nouvelles applications. Le remplacement recommandé est une bibliothèque .NET Standard, qui cible toutes les implémentations de .NET qui prennent en charge une version spécifique de .NET Standard. Pour plus d'informations, consultez .NET Standard.

Tout ça pour ça ... ça fait peur non quand même ... en plus l'utilisation du terme "interplateforme" sans doute une erreur de la traduction car cross-plateforme ou multiplateforme existent déjà !

En tous les cas avec Visual Studio 2017, vous ne pourrez plus créer directement de projet Xamarin PCL les deux options qu'il reste sont :

Xamarin - Cross platforme
Xamarin - Cross platforme - .NET Standard & Projet partagé
  • .NET Standard
  • Projet partagé

L'avènement du .NET Standard est certainement bon pour ceux qui commencent maintenant à développer avec Xamarin.

Ça commence à s'éclaircir non ?

Ma deuxième application en C# avec Xamarin

Vous avez vu les déboires à configurer une plateforme de développement qui fonctionne avec Xamarin et Visual Studio 2017. Mais maintenant on peut y aller tout fonctionne.

Nous allons étudier l'application : Todo

Vérification de l'installation

Pour vérifier une installation il est nécessaire de mettre un point d'arrêt dans le code de l'application et de vérifier que l'on s'y arrête bien.

On met un point d'arrêt dans :

\\Mes Samples\Todo\Todo.Android\MainActivity.cs

Et dans :

\\Mes Samples\Todo\Todo\Data\TodoItemDatabase.cs

Au passage notez comment on affiche les fenêtre des "Points d'arrêts" (breakpoints).
Visual Studio Xamarin Todo
Visual Studio Xamarin Todo

1 - Afficher la fenêtre des Points d'arrêts
2 - Liste des points d'arrêts posés pour vérifier le fonctionnement de l'application Xamarin Todo

Exécution de l'application

On vérifie que l'on passe bien par le premier point d'arrêt au lancement de l'exécution de l'application :

Application Xamarin Todo exécution jusqu'au premier point d'arrêt
Et maintenant on va tenter d'atteindre le deuxième point d'arrêt ...

Je créé un Todo afin de le sauvegarder :

Xamarin application Todo - Création
Et maintenant la sauvegarde ...  Alors la sauvegarde est intéressante car elle fait passer par du code qui se trouve dans la partie "portable" ou "partageable" de la solution. De plus elle met en oeuvre la partie SQL Lite ...

Xamain Application Todo - Save
Et là on ne va pas s'arrêter sur le point d'arrêt, oups.

Xamarin Application Todo en mode Arrêt !
Je clique sur "Poursuivre l'exécution" puis sur arrêter le déboguage :

Xamarin Application Todo - Création et sauvegarde d'un Todo

Conclusion

Pourquoi le deuxième point d'arrêt n'a t-il pas été atteint ? Il faut regarder dans le Gestionnaire de configurations de la solution.


Xamarin - Gestionnaire de configuration
Xamarin - Gestionnaire de configuration
Et là on voit que la partie partageable de la solution ne peut pas être déployée !? Donc il est normal que le débogueur ne puisse pas afficher le code à cet endroit mais pourquoi ?

Xamarin Application Todo - Gestionnaire de configurations

J'ai le sentiment qu'il est important de comprendre pourquoi. Cela permettra de mieux cerner les applications multiplateformes avec Xamarin.

En créant un nouveau projet :

Xamarin - Stratégie de partage de code
En cliquant sur le "?" on trouve la solution et la façon dont une application Xamarin est structurée :

https://docs.microsoft.com/fr-fr/xamarin/cross-platform/app-fundamentals/code-sharing

On voit également que le modèle "Bibliothèque de classes portables" que je me suis évertué à essayer de faire fonctionner est progressivement abandonné snif !

Échec inattendu de la tâche "GenerateJavaStubs" - Solution

Mais qu'elle est cette erreur, comment trouver la solution. Ce matin je repars sur cette erreur "Le chemin d'accès spécifié, le nom de fichier ou les deux sont trop longs. Le nom de fichier qualifié complet doit comprendre moins de 260 caractères et le nom du répertoire moins de 248 caractères." Erreur que j'ai détaillé dans le post précédent.

Gravité Code Description Projet Fichier Ligne État de la suppressionErreur  Échec inattendu de la tâche "GenerateJavaStubs".
System.IO.PathTooLongException: Le chemin d'accès spécifié, le nom de fichier ou les deux sont trop longs. Le nom de fichier qualifié complet doit comprendre moins de 260 caractères et le nom du répertoire moins de 248 caractères.
   à System.IO.LongPathHelper.Normalize(String path, UInt32 maxPathLength, Boolean checkInvalidCharacters, Boolean expandShortPaths)
   à System.IO.Path.NewNormalizePath(String path, Int32 maxPathLength, Boolean expandShortPaths)
   à System.IO.Path.NormalizePath(String path, Boolean fullCheck, Int32 maxPathLength, Boolean expandShortPaths)
   à System.IO.Path.GetFullPathInternal(String path)
   à System.IO.Path.GetFullPath(String path)
   à Xamarin.Android.Tasks.GenerateJavaStubs.Run(DirectoryAssemblyResolver res)
   à Xamarin.Android.Tasks.GenerateJavaStubs.Execute()
   à Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
   à Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__26.MoveNext() Todo.Android

On se croirait revenu aux temps du DOS de Windows qui n'était pas capable de gérer des chemins de fichier de plus de 256 caractères. Mais d'ailleurs, le peut-il aujourd'hui ? ;-) LoL.

Mais cette fois j'ai l'idée, je lis plus attentivement le message d'erreur. Comme quoi "il faut lire" comme dirait Dany Boon et la nuit porte conseil. Je rapatrie mon projet à la racine du disque dur et devinez quoi ? Ca fonctionne !

Solution

Le chemin (path) de votre projet est trop long ... Créez un répertoire plus proche de la racine du disque dur.

Et voilà :

Exécution du Sample Todo de Xamarin sur mon emulateur Android Nougat 7.5
Incroyable non ? Oui mais avant de la trouver celle-la j'ai bien galéré alors c'est cadeau, n'hésitez pas à laisser votre commentaire ou à cliquer sur le côté dans vous savez quoi ... ;-)

Have fun!

Xamarin Sample Todo - Error : Can not resolve SQLite-net add NuGet or remove the reference

Vous venez de télécharger le Sample Todo de Xamarin Community, vous lancez la solution avec votre Visual Studio 2017 et pourtant cela ne fonctionne pas ! Et oui c'est toujours pareil pourquoi font ils des exemples qui ne fonctionnent pas ? Il faut l'avouer c'est souvent notre installation qui n'est pas correcte.

https://developer.xamarin.com/samples/xamarin-forms/Todo/
Xamarin - Todo Sample - Error : Can not resolve SQLite-net
On va s'en sortir pas de souci ... c'est quand même incroyable ils sont incapables de fournir un projet qui fonctionne.

Donc vous avez téléchargé le projet et ouvert la solution dans votre Visual Studio puis sur le projet Todo vous faite bouton droit gérer les packages Nugets et vous voyez :
Xamarin Todo Sample - Il manque des références
Ce que nous devrions avoir :

https://docs.microsoft.com/fr-fr/xamarin/xamarin-forms/app-fundamentals/databases
Xamarin Todo Sample - Nugets
Allons-y ... rien en va fonctionner sauf l'exécution de la commande :

PM> Install-Package sqlite-net-pcl -Version 1.4.118

directement dans la console du gestionnaire de package.

Exécution de la commande d'installation du package dans la console du Gestionnaire de package
Wahou qu'elle merde tout ça !  Ca recommence, on se dirait dans un état instable alors que l'application Xamarin Todo à déjà fonctionnée sur des versions antérieures de Visual Studio et du Framework Xamarin !

Je tente d'exécuter l'installeur de Visual Studio pour regarder quel SDK est installé ... Il me lance une mise à jour de Visual Studio tient tient tient ...

Ca va peut être fonctionner ensuite ...

Non rien à faire, il reste une erreur :

Echec inattendu
Gravité Code Description Projet Fichier Ligne État de la suppression
Erreur  Échec inattendu de la tâche "GenerateJavaStubs".
System.IO.PathTooLongException: Le chemin d'accès spécifié, le nom de fichier ou les deux sont trop longs. Le nom de fichier qualifié complet doit comprendre moins de 260 caractères et le nom du répertoire moins de 248 caractères.
   à System.IO.LongPathHelper.Normalize(String path, UInt32 maxPathLength, Boolean checkInvalidCharacters, Boolean expandShortPaths)
   à System.IO.Path.NewNormalizePath(String path, Int32 maxPathLength, Boolean expandShortPaths)
   à System.IO.Path.NormalizePath(String path, Boolean fullCheck, Int32 maxPathLength, Boolean expandShortPaths)
   à System.IO.Path.GetFullPathInternal(String path)
   à System.IO.Path.GetFullPath(String path)
   à Xamarin.Android.Tasks.GenerateJavaStubs.Run(DirectoryAssemblyResolver res)
   à Xamarin.Android.Tasks.GenerateJavaStubs.Execute()
   à Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
   à Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__26.MoveNext() Todo.Android


La tâche GenerateJavaStubs, pouah c'est pas beau ! Décidément ce n'est pas sec !

J'ai l'impression que les Samples devraient être mis à jour pour être utilisés par la dernière version de Visual Studio. Pour cela vous comparez un Template d'application généré avec Visual Studio 2017 version 15.8.1 avec le Sample pour constater que ce n'est pas du tout la même chose.

C:\Users\Xuser\AppData\Roaming\Microsoft\VisualStudio\15.0_f8dc3dc3\ActivityLog.xml
Not fun at all!

La solution est Ici.

Xamarin, ASP.NET Core où sont les NuGets c'est la stupéfaction !

Vous avez sauté le pas de l'ASP.NET Standard et vous êtes maintenant avec ASP.NET Core vous n'hésitez plus maintenant que votre Visual Studio est configuré avec les émulateur d'Android à générer des applications pour Xamarin mais vous avez encore un problème avec les packages NuGets et là ... C'est la stupéfaction !

En effet, je prend le temps d'écrire ce post car je suis maintenant obligé de résoudre ce problème ! Je m'intéresse aux Samples avec Xamarin. Par le passé j'avais écris ASP.NET Core où sont les NuGets ?

https://forums.xamarin.com/
Xamarin Forum
Maintenant si je créé un nouveau projet Xamarin avec mon Visual Studio, les Nugets sont dans :

C:\Users\Xxxx\.nuget\packages

C'est la CATA Totale !

En effet les Nugets dépendent du type d'application dépendent également de leur propre version, ils sont donc très fortement liés au projet et ne peuvent en aucun cas être communs à tous les projets. Je ne comprends pas totalement pourquoi ma plateforme de développement est configurée ainsi Est-ce lors de l'installation de Visual Studio ?

Il faut trouver le moyen de mettre ces foutus NuGets par projet ... Je pars donc à la recherche d'une solution.

I'll be back!

Recherche rapide de solution, on me dit :

Comment puis-je mettre à jour mes NuGets ?

Et quand je fais ça, j'obtiens :


Visual Studio -> Outils -> Extensions et mises à jour -> mises à jour -> Error 503 Service Unavailable

Error 503 Service Unavailable

Whaou la merde !!!

En bas de la fenêtre je vois "Changer les paramètres de vos extensions et mise à jour" je clique dessus ...

ça sert à rien mais on est pas loin
En effet en dessous je vois :


Options -> Gestionnaire de package Nuget
Gestionaire de packages NuGet
Options -> Gestionnaire de package Nuget
Bon, tout ça ne sert à rien mais bon ... on va finir par y arriver.

Faire migrer packages.config vers PackageReference...

Tient qu'elle drôle cette possibilité, en cliquant droit sur le fichier package.config d'une ancienne solution Xamarin qu'elle n'est pas ma surprise :

Faire migrer packages.config vers PackageReference...
Je trouve cette possibilité dans une application dont les packages sont gérés par des fichiers package.config. Cette option apparait quand on clique droit sur le fichier.

Tient tient, j'essaye je clique :


Faire migrer packages.config vers PackageReference... Xamarin.Android
Je clique sur : M'aider à effectuer la migration vers PackageRefernce NuGet

Migrate from packages.config to PackageReference
Et là on m'explique les bénéfices et les limitation que j'ai à passer au PackageReference !? Exactement le contraire de ce que j'écrivais au début de ce post c'est à dire que les ingé de Redmond prennent à contre pied l'utilité des packages gérés dans le répertoire "packages" lié à une solution.

Managing the global packages, cache, and temp folders
Et là on me dit enfin tout sur cette nouvelle façon de gérer les NuGets Packages, franchement c'est du foutage de gueule non ?

Et pour finir on vous explique même comment revenir en arrière :

How to roll back to packages.config
On nous apprend que le processus de migration vers PackageReference à sauvé le fichier package.config qui vous permet de revenir en arrière.

Franchement que dire, que faire nous ne sommes que de petites choses, le principal est de trouver le bon chemin, le moins pénible pour arriver au bout du projet.


Références avant PackageReference
Une fois le passage à PackageReference effectué les nouvelles références se présentent ainsi :


Passage à PackageReference effectué
Voilà, encore une désagréable surprise avec la gestion des NuGets. Décidément on peut préférer la gestion façon GAC ou DLL d'antan. Il n'y a rien de facile rien de simple dans tout ça.

Have fun!