c2iPackageExplorer: Accéder au manifeste d'un package
c2iPackageExplorer est disponible ici.
Dans le précédent article, nous avons vu comment ajouter une référence aux APIs de WinRT et comment énumérer les packages installés sur votre machine.
Ici, nous allons voir comment lire le contenu du manifeste d'une application.
Références
Reprenons notre application Console et ajoutons trois nouvelles références :
- System.Runtime.WindowsRuntime
- System.IO,
- System.Threading.Tasks
Les 3 se trouvent toujours dans C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\Facades\.
Les 2 premières vont nous permettrent d'utiliser les extensions de IStorageFile pour lire le contenu d'un fichier avec un stream .NET "classique".
La dernières, pour gérer les Tasks avec les APIs WinRT.
Le manifeste
Quand Windows installe une application WinRT sur votgre ordinateur, il publie également un manifeste qui se trouve dans le répertoire de l'application. Ce manifeste permet à Windows d'exécuter l'application de façon "safe", de découvrir l'application.
Ce manifeste est le fichier AppxManifest.xml et se trouve dans le folder InstalledLocation du package.
Prenons l'exemple d'une application "merveilleuse" 1001Bookmarks. Le nom de son package est : "c2i.fr.1001bookmarks".
Pour obtenir comme dans l'article précédent des informations dessus, on a donc le code suivant :
var pm = new PackageManager(); var packages = pm.FindPackagesForUser(string.Empty); var package1001Bookmarks = packages.FirstOrDefault(pk => pk.Id.Name == "c2i.fr.1001bookmarks"); if (package1001Bookmarks == null) { Console.WriteLine("Introuvable !"); return; } var appStorageFolder = package1001Bookmarks.InstalledLocation;
Dans la variable appStorageFolder, on a une référence vers un objet de type IStorageFolder, objet typique du framework WinRT. Ce dossier contient donc bien un fichier AppxManifest.xml. Voici le code pour en lire son contenu :
private static async Task<string> ReadManifest(IStorageFolder folder) { var file = folder.GetFileAsync("AppxManifest.xml").GetAwaiter().GetResult(); using (var stream = await file.OpenStreamForReadAsync()) { var xml = XDocument.Load(stream); return xml.ToString(); } }
On utilise ici l'extension OpenStreamForReadAsync (dans la dll System.Runtime.WindowsRuntime) qui retourne un Stream "classique" .NET. Ensuite, lecture du contenu avec un XDocument (on l'utilisera plus loin pour parser le contenu du manifeste).
Il nous suiffit maintenant d'appeler cette méthode ReadManifest :
private static void Main() { var pm = new PackageManager(); var packages = pm.FindPackagesForUser(string.Empty); var package1001Bookmarks = packages.FirstOrDefault(pk => pk.Id.Name == "c2i.fr.1001bookmarks"); if (package1001Bookmarks == null) { Console.WriteLine("Introuvable !"); return; } var appStorageFolder = package1001Bookmarks.InstalledLocation; var content = ReadManifest(appStorageFolder).GetAwaiter().GetResult(); Console.WriteLine("-------------------MANIFEST---------------------------------"); Console.WriteLine(content); Console.ReadLine(); }