Système de gestion des ressources

Système de gestion des ressources

[ Cet article est destiné aux développeurs de Windows 8.x et Windows Phone 8.x qui créent des applications Windows Runtime. Si vous développez une application pour Windows 10, voir la Documentation ]

Ce système fait partie des outils de prise en charge proposés lors de la création de l’application. Il crée un fichier qui est empaqueté avec l’application, puis est appelé par Windows Runtime pour résoudre les ressources lorsque l’application s’exécute dans un contexte utilisateur.

Fichier d’index de ressource de package

Chaque package d’application doit contenir un index binaire des ressources dans l’application. Ce fichier est créé au moment de la génération et est référencé comme un fichier d’index de ressource de package.

  • Le fichier d’index de ressource de package est empaqueté avec le reste de l’application et contribue à la résolution des ressources au moment de l’exécution.
  • L’index de ressource de package contient les ressources de type chaîne réelles, ainsi qu’un ensemble indexé de chemins d’accès de fichiers, qui font référence aux fichiers du package.
  • Les packages contiennent généralement un seul fichier d’index de ressource de package, appelé resources.pri.
  • Le fichier resources.pri à la racine de chaque package est chargé automatiquement quand ResourceManager est instancié.
  • Les fichiers d’index de ressource de package peuvent être créés et vidés avec l’outil MakePRI.exe.
  • Lors du développement d’applications standard, vous n’aurez pas besoin de l’outil MakePRI.exe, car il est déjà intégré dans le flux de travail de compilation de Visual Studio. Par ailleurs, Visual Studio prend en charge la modification de fichiers d’index de ressource de package dans une interface utilisateur dédiée. Toutefois, les traducteurs et les outils qu’ils utilisent reposent peut-être sur l’outil MakePRI.exe.
  • Chaque fichier d’index de ressource de package contient une collection de ressources nommée, appelée resource map. Quand un fichier d’index de ressource de package contenu dans un package est chargé, le nom du mappage de ressources est vérifié par rapport au nom de l’identité du package.
  • Les fichiers d’index de ressource de package incluent uniquement des données ; ils n’utilisent pas le format exécutable portable (PE). Ils sont spécifiquement conçus pour inclure un format de ressource de type données uniquement pour Windows. Ils remplacent les ressources contenues dans des fichiers DLL du modèle d’application Win32.

API Windows Runtime

Fonctionnalités de base (ResourceLoader)

L’accès aux ressources est exposé via les API WinRT pour JavaScript, C#, Visual Basic et C++. Pour accéder aux ressources, le moyen le plus simple consiste à utiliser l’espace de noms Windows.ApplicationModel.Resources et la classe ResourceLoader. La classe ResourceLoader propose un accès de base aux ressources de type chaîne des différents fichiers de ressources, bibliothèques référencées ou autres packages.

Fonctionnalités avancées (ResourceManager)

La classe ResourceManager (dans l’espace de noms Windows.ApplicationModel.Resources.Core) fournit des informations supplémentaires sur les ressources, telles que l’énumération et l’inspection. Cela dépasse les fonctions que la classe ResourceLoader peut fournir.

Un objet NamedResource est une ressource logique individuelle associée à diverses variantes linguistiques ou qualifiées. Il décrit la vue logique de la ressource, avec un nom comme Header1 ou logo.jpg.

Un objet ResourceCandidate représente une valeur de ressource concrète et ses qualificateurs, par exemple la chaîne "Hello World" pour l’anglais ou la chaîne "logo.Scale-100.jpg", en tant que ressource d’image qualifiée spécifique à la résolution scale-100.

Les ressources disponibles pour une application sont stockées dans des collections hiérarchiques, auxquelles vous pouvez accéder via un objet ResourceMap. La classe ResourceManager permet d’accéder aux différentes instances d’élément ResourceMap de niveau supérieur utilisées par l’application, qui correspondent aux différents packages pour l’application. La valeur MainResourceMap correspond au mappage de ressources pour le package d’application actuel, et exclut tout package d’infrastructure référencé. Chaque élément ResourceMap est nommé d’après le nom de package spécifié dans le manifeste du package. Dans un élément ResourceMap figurent des sous-arborescences d’élément ResourceMap (voir ResourceMap.GetSubtree), qui peuvent contenir d’autres objets NamedResource. Ces arborescences correspondent généralement aux fichiers de ressources qui incluent la ressource. Pour en savoir plus, voir « Comment charger des ressources de type chaîne » (HTML ou XAML). Voici un exemple :



var rcns = Windows.ApplicationModel.Resources.Core;
var resMap = rcns.ResourceManager.current.mainResourceMap.getSubtree("Resources");
var resContext = rcns.ResourceContext.getForCurrentView();
var str = resMap.getValue("String1", resContext).valueAsString;

Remarque  Les identificateurs de ressource sont traités comme des fragments d’URI (Uniform Resource Identifier), soumis à la sémantique correspondante. Par exemple, l’élément GetValue("Caption%20") est considéré comme un élément GetValue ("Caption"). N’utilisez pas le signe "?" ou "#" dans les identificateurs des ressources, car ils terminent l’évaluation du chemin d’accès à la ressource. Par exemple, l’élément "MyResource?3" est considéré comme un élément "MyResource".
 

L’élément ResourceManager prend en charge l’accès aux ressources de type chaîne d’une application, mais propose également la capacité d’énumération et d’inspection des diverses ressources des fichiers. Afin d’éviter les collisions entre les fichiers et les autres ressources qui proviennent d’un fichier, tous les chemins d’accès de fichiers indexés résident tous dans une sous-arborescence ResourceMap réservée, "Fichiers". Par exemple, le fichier images/logo.png correspond au nom de ressource Files/images/Logo.png.

Les API StorageFile gèrent de manière transparente les références aux fichiers sous forme de ressources et sont appropriées aux scénarios d’utilisation classiques. ResourceManager ne doit être utilisé que pour les scénarios avancés, par exemple un contexte de substitution ou l’énumération de valeurs possibles.

ResourceContext

Les ressources candidates sont choisies en fonction d’un élément ResourceContext particulier, qui est une collection de valeurs de qualificateur de ressource (langue, échelle, etc.). Un contexte par défaut utilise la configuration actuelle de l’application pour chaque valeur de qualificateur, sauf en cas de substitution. En général, les ressources peuvent être qualifiées pour l’échelle, qui peut varier d’un moniteur à l’autre, et donc d’une vue d’application à une autre. Par conséquent, chaque vue d’application possède un contexte par défaut distinct. Le contexte par défaut d’une vue donnée peut être obtenu à l’aide de l’élément ResourceContext.GetForCurrentView. Chaque fois qu’une ressource candidate est extraite, une instance ResourceContext doit être transmise pour obtenir la valeur la plus appropriée pour une vue donnée.

Quand une ressource est demandée, il est possible que plusieurs candidats présentent, dans une certaine mesure, une correspondance avec le contexte de ressource actuel. Le système de gestion des ressources analyse tous les candidats et détermine le meilleur à retourner. Concrètement, il classe tous les candidats en tenant compte de tous les qualificateurs.

Au cours du processus de classement, les différents qualificateurs se voient affecter des niveaux de priorité spécifiques : la langue a le plus gros impact sur le classement global, suivie du contraste, puis de l’échelle, etc. Pour chaque qualificateur, les qualificateurs de candidat sont comparés à la valeur du qualificateur du contexte pour déterminer une qualité de correspondance. La façon dont la comparaison est effectuée dépend du qualificateur.

Pour certains qualificateurs, tels que l’échelle et le contraste, il existe toujours un certain degré de correspondance minimal. Par exemple, un candidat qualifié pour la valeur scale-100 offre une correspondance, dans une certaine mesure, avec un contexte scale-180, mais avec une qualité moindre que les candidats qualifiés pour la valeur scale-140 ou scale-180 (correspondance parfaite).

Pour d’autres qualificateurs, toutefois, comme la langue ou la région de résidence, il est possible que la comparaison aboutisse à une absence de correspondance (ainsi qu’à des degrés de correspondance). Par exemple, un candidat qualifié pour la langue "en-US" présente une correspondance minimale avec un contexte "en-GB", tandis qu’un candidat qualifié pour "fr" n’offre aucune correspondance avec ce contexte. De même, un candidat qualifié pour la région de résidence "155" (Europe occidentale) présente une assez bonne correspondance avec le contexte d’un utilisateur dont le paramètre de région de résidence est "FR", tandis qu’un candidat qualifié pour "US" n’offre aucune correspondance.

Quand un candidat est évalué et que la comparaison aboutit à une absence de correspondance pour tous les qualificateurs, ce candidat se voit attribuer un classement global de non-correspondance et n’est pas sélectionné. Ainsi, les qualificateurs à priorité élevée peuvent s’avérer déterminants pour la sélection de la meilleure correspondance, mais même un qualificateur à faible priorité peut éliminer un candidat en raison d’une non-correspondance.

Un candidat est neutre par rapport à un qualificateur s’il n’est pas du tout marqué pour ce qualificateur. Pour tout qualificateur, un candidat neutre constitue toujours une correspondance pour la valeur du qualificateur de contexte, mais uniquement avec une qualité de correspondance inférieure à celle d’un candidat marqué pour ce qualificateur et présentant un certain degré de correspondance (exacte ou partielle). Par exemple, si des candidats sont qualifiés pour "en-US", "en" et "fr", et qu’il existe également un candidat neutre du point de vue de la langue, les candidats sont classés dans l’ordre suivant pour un contexte dont la valeur de qualificateur de langue est "en-GB" : "en", "en-US", neutre et "fr". Dans ce cas précis, "fr" n’a aucune correspondance alors que les autres candidats offrent un certain degré de correspondance.

Le processus de classement global commence par l’évaluation des candidats par rapport au qualificateur dont la priorité est la plus élevée : la langue. Les non-correspondances sont éliminées. Les candidats restants sont classés en fonction de la qualité de leur correspondance avec la langue. En cas d’égalité, le qualificateur suivant dont la priorité est la plus élevée, le contraste, est pris en considération ; la qualité de la correspondance avec le contraste permet alors de départager les candidats. Après le contraste, le qualificateur d’échelle est utilisé pour départager les candidats ayant obtenu des scores équivalents, et ainsi de suite, jusqu’à ce que suffisamment de qualificateurs aient été utilisés pour aboutir à un classement précis.

Si tous les candidats sont écartés en raison de qualificateurs qui ne correspondent pas au contexte, le chargeur de ressources effectue un deuxième passage à la recherche d’un candidat par défaut à afficher. Les candidats par défaut sont déterminés lors de la création du fichier d’index de ressource de package et sont nécessaires pour garantir qu’au moins un candidat puisse être sélectionné pour tout contexte d’exécution (pour plus d’informations, voir Compilation des ressources (MakePRI.exe)). Si un candidat possède des qualificateurs qui n’ont pas de correspondance et qui ne sont pas des valeurs par défaut, la ressource candidate n’est plus jamais prise en considération.

Pour l’ensemble des ressources candidates qui continuent d’être prises en considération, le chargeur de ressources examine la valeur du qualificateur de contexte dont la priorité est la plus élevée et choisit la meilleure correspondance ou le meilleur score par défaut. Toute correspondance réelle est prioritaire sur le score par défaut.

En cas d’égalité, la valeur du qualificateur de contexte dont la priorité est la plus élevée est examinée et le processus se poursuit, jusqu’à ce que la meilleure correspondance possible soit trouvée.

Pour obtenir des exemples, voir Exemples de choix des ressources.

Compilation des ressources (MakePRI.exe)

MakePRI.exe est un outil en ligne de commande qui permet de créer et vider des fichiers d’index de ressource de package. Il est intégré à MSBuild dans le cadre de Microsoft Visual Studio mais peut être utile aux développeurs pour créer des packages manuellement ou à l’aide de systèmes de génération personnalisés.

Options de commande de MakePRI.exe

MakePRI.exe dispose d’un ensemble d’options de commande : createconfig, new, versioned, resourcepack et dump. Pour en savoir plus sur leur utilisation, voir Options de commande de MakePRI.exe.

Configuration de MakePRI.exe

Le fichier de configuration XML d’index de ressource de package spécifie les ressources à indexer et de quelle manière. Le schéma du fichier de configuration XML est décrit dans la configuration de MakePRI.exe.

Indexeurs spécifiques au format

L’élément MakePRI.exe est généralement utilisé avec les options new, versioned, ou resourcepack. Dans ce cas, il indexe les fichiers sources pour générer un index des ressources. MakePRI.exe utilise divers indexeurs individuels pour lire les différents fichiers de ressources sources ou conteneurs de ressources. L’indexeur le plus simple est l’indexeur de dossier, qui indexe le contenu d’un dossier, par exemple des images .jpg ou .png.

Les indexeurs spécifiques au format sont identifiés par les éléments <indexer-config> contenus dans un élément <index> du fichier de configuration. L’attribut type identifie l’indexeur spécifique au format à utiliser.

En règle générale, les conteneurs de ressources rencontrés lors de l’indexation font indexer leur contenu au lieu de l’ajouter eux-mêmes à l’index. Par exemple, les fichiers .resjson trouvés par l’indexeur de dossier peuvent être indexés par un indexeur .resjson. Dans ce cas, les fichiers .resjson proprement dits ne figurent pas dans l’index. (Cela suppose la présence, dans le fichier de configuration, d’un élément <indexer-config> pour l’indexeur associé au conteneur concerné.) En règle générale, les qualificateurs contenus dans une entité, par exemple un dossier ou un fichier .resjson, sont appliqués à toutes les ressources qui s’y trouvent, notamment les fichiers du dossier ou les chaînes du fichier .resjson.

Voir Indexeurs spécifiques au format pour obtenir les descriptions et les schémas des types d’indexeur suivants.

Folder

Indexe le contenu d’un dossier et détermine les qualificateurs de ressources à partir des noms de dossier et de fichier. Consultez le paragraphe Folder de la rubrique Indexeurs spécifiques au format.

ResJSON

Indexe le contenu d’un fichier .resjson, qui est un fichier de ressources de type chaîne. Consultez le paragraphe ResJSON de la rubrique Indexeurs spécifiques au format.

ResW

Indexe le contenu d’un fichier .resw, qui est un fichier de ressources de type chaîne. Consultez le paragraphe ResW de la rubrique Indexeurs spécifiques au format.

ResFiles

Indexe le contenu d’un fichier .resfiles. Consultez le paragraphe ResFiles de la rubrique Indexeurs spécifiques au format.

PRI

Indexe le contenu d’un fichier d’index de ressource de package. Cet élément est généralement utilisé pour indexer une ressource contenue dans un autre assembly, une autre DLL ou une autre bibliothèque de classes.

Les noms de ressources, qualificateurs et valeurs contenus dans le fichier d’index de ressource de package sont tous directement gérés dans le nouveau fichier d’index de ressource de package. Le mappage de ressources de niveau supérieur n’est pas géré dans l’index de ressource de package final. Les mappages de ressources sont fusionnés.

Voir la section PRI de la rubrique Indexeurs spécifiques au format.

PRIINFO

Indexe le contenu d’un fichier de vidage détaillé. Le fichier de vidage est produit à l’aide de la commande vidage de MakePri.exe, avec l’option correspondant au type de vidage détaillé. Voir la section PRIINFO de la rubrique Indexeurs spécifiques au format.

Avertissements et messages d’erreur de MakePRI.exe

L’avertissement

Resources found for language(s) '<language(s)>' but no resources found for default language(s): '<language(s)>'. Change the default language or qualify resources with the default language.

apparaît quand MakePRI.exe ou MSBuild découvre que des fichiers ou des ressources de chaîne pour une ressource nommée donnée sont marqués avec des qualificateurs de langue, mais qu’aucun candidat n’est trouvé pour une langue par défaut. Le processus de marquage des fichiers est décrit dans Comment nommer des ressources à l’aide de qualificateurs. Un fichier ou dossier peut comporter un nom de langue et ne pas disposer de ressources qualifiées pour la langue par défaut spécifique. Par exemple, si un projet utilise "en-US" comme langue par défaut, qu’il contient un fichier nommé "de/logo.png", mais qu’aucun fichier n’est marqué avec la langue par défaut "en-US", cet avertissement s’affiche. Pour supprimer cet avertissement, vous devez qualifier un ou plusieurs fichiers ou ressources de chaîne avec la langue par défaut, ou modifier la langue par défaut. Vous pouvez modifier la langue par défaut dans les projets d’application du Windows Store en ouvrant package.appxmanifest dans Visual Studio et en éditant les "langues par défaut" sous l’onglet Interface utilisateur de l’application.

L’avertissement

No default or neutral resource given for '<resource identifier>'. The application may throw an exception for certain user configurations when retrieving the resources.

s’affiche lorsque MakePRI.exe ou MSBuild découvre des fichiers ou ressources marqués avec des qualificateurs linguistiques pour lesquels les ressources sont imprécises. Il existe des qualificateurs, mais il n’y a aucune garantie qu’une ressource candidate particulière puisse être renvoyée pour l’identificateur de ressource correspondant au moment de l’exécution. S’il n’existe aucune ressource candidate pour une langue, une région ou tout autre qualificateur, qui soit une ressource par défaut ou une ressource correspondant en permanence au contexte d’un utilisateur, cet avertissement s’affiche. Au moment de l’exécution, pour des configurations utilisateur particulières telles que les préférences linguistiques ou l’emplacement géographique d’un utilisateur (Paramètres du PC > Région et langue), les API utilisées pour récupérer la ressource peuvent lever une exception inattendue. Pour supprimer cet avertissement, des ressources par défaut doivent être fournies, par exemple une ressource relative à la langue par défaut ou la région d’origine du projet (homeregion-001).

Utilisation de MakePRI.exe dans un système de génération

Les systèmes de génération doivent utiliser les commandes MakePRI.exe "new", "versioned" ou "resourcepack", selon le type de projet généré. Les systèmes de génération qui créent un fichier d’index de ressource de package actualisé doivent utiliser la commande "new". Les systèmes de génération qui doivent assurer la compatibilité des décalages internes par le biais d’itérations peuvent utiliser la commande "versioned". Les systèmes de génération qui doivent créer un fichier d’index de ressource de package contenant des variantes de ressources supplémentaires, en vérifiant qu’aucune nouvelle ressource n’est ajoutée pour cette variante, doivent utiliser la commande "resourcepack".

Les systèmes de génération qui nécessitent un contrôle explicite sur les fichiers sources indexés peuvent utiliser l’indexeur ResFiles au lieu d’indexer un dossier. Les systèmes de génération peuvent également utiliser plusieurs opérations d’indexation avec différents indexeurs spécifiques au format pour générer un fichier d’index de ressource de package unique.

Les systèmes de génération peuvent également utiliser l’indexeur spécifique au format de l’index de ressource de package pour ajouter des fichiers d’index de ressource de package prégénérés dans l’index de ressource de package à partir d’autres composants, par exemple des bibliothèques de classes, des assemblys, des Kits de développement logiciel (SDK) et des DLL.

Lorsque des fichiers d’index de ressource de package sont générés pour d’autres composants, bibliothèques de classes, assemblys, DLL et Kits de développement logiciel (SDK), la configuration de initialPath doit être utilisée pour vérifier que les ressources de composants n’ont pas de mappages de sous-ressources en conflit avec l’application dans laquelle elles sont incluses.

Rubriques associées

API
Windows.ApplicationModel.Resources
ResourceLoader
Windows.ApplicationModel.Resources.Core
NamedResource
ResourceCandidate
ResourceManager
ResourceManager.DefaultContext
ResourceMap
Autres rubriques
Exemples de choix des ressources
Options de commande de MakePRI.exe
Configuration de MakePRI.exe
Indexeurs spécifiques au format
Comment charger des ressources de type chaîne
Comment nommer des ressources à l’aide de qualificateurs

 

 

Afficher:
© 2017 Microsoft