ResourceManager
La classe ResourceManager offre un accès pratique aux ressources correctes de culture au moment de l'exécution. ResourceManager gère plusieurs ressources à partir d'une source commune ayant un nom de racine particulier. Plusieurs constructeurs de classe offrent une prise en charge pour divers scénarios, notamment l'extraction de ressources d'assemblys et de fichiers de ressources. Une méthode static distincte prend en charge l'extraction de ressources à partir de fichiers de ressources autonomes, tels que les images. L'implémentation par défaut charge tous les noms de ressources, puis les valeurs à la demande, qu'elle stocke pour une utilisation ultérieure. Ceci utilise moins de mémoire que la classe ResourceSet (présentée plus loin dans cette section), en supposant que toutes les ressources ne sont pas chargées. Toutefois, l'extraction d'une ressource spécifique peut prendre plus de temps. De plus, l'implémentation ResourceManager par défaut prend en charge la sérialisation d'objets. Enfin, les objets ResourceManager offrent une recherche des ressources de secours des cultures neutres et indépendantes des régions, lorsque aucune ressource localisée spécifique n'est fournie.
Vous avez déjà examiné un mécanisme simple, à l'aide de ResourceReader, pour énumérer des ressources. Vous allez à présent utiliser le puissant ResourceManager pour réaliser à peu près la même action.
Listing 4a. Ressources nommées avec ResourceManager (ResWrite.cs)
...
ResourceManager rm = ResourceManager.
CreateFileBasedResourceManager("sample", ".", null);
Console.WriteLine(rm.GetString("test1"));
Console.WriteLine(rm.GetString("test2"));
Console.WriteLine(rm.GetString("test3"));
Console.WriteLine(rm.GetString("test4"));
Console.WriteLine(rm.GetObject("test5").ToString());
...
Listing 4b. Ressources nommées avec ResourceManager (ResWrite.vb)
...
Dim rm As ResourceManager = ResourceManager.
CreateFileBasedResourceManager ("sample", ".", Nothing)
Console.WriteLine(rm.GetString("test1"))
Console.WriteLine(rm.GetString("test2"))
Console.WriteLine(rm.GetString("test3"))
Console.WriteLine(rm.GetString("test4"))
Console.WriteLine(rm.GetObject("test5").ToString())
...
La première chose à noter est la méthode CreateFileBasedResourceManager static, qui prend trois arguments : le fichier, l'emplacement et l'utilisation ou non de ResourceSet qui n'est pas une classe par défaut. (Le code suppose que l'emplacement est le répertoire de base de l'application, appelé AppBase.) La seconde chose à noter est la facilité d'extraction des ressources chaîne à l'aide de la méthode GetString de la classe ResourceManager.
Vous pouvez également utiliser la méthode GetObject pour extraire une ressource image. L'exemple précédent écrit simplement la valeur du nom de la ressource, mais les deux lignes de code suivantes (extraites de l'exemple de fichier Graphic.cs) montrent comment utiliser cette méthode pour extraire et afficher une image graphique :
rm = new ResourceManager("Images", this.GetType().Assembly);
pictureBox1.Image = (System.Drawing.Image)rm.GetObject("flag");
Voici l'équivalent Visual Basic de l'exemple de fichier Graphic.vb :
rm = New ResourceManager("Images", Me.GetType().Assembly)
pictureBox1.Image = CType(rm.GetObject("flag"), System.Drawing.Image)
Les deux instructions précédentes chargent l'objet appelé flag à partir du fichier de ressources Images, le castent en type Image, puis assignent le résultat à la propriété Image de la zone d'image. Les éléments chargés dépendent évidemment de la culture utilisée. Pour des ressources de culture neutre, la provenance des ressources est spécifiée par l'option du compilateur, montrée ci-dessous :
.../res:Images.resources,Images.resources...
Dans ce cas particulier, l'option du compilateur incorporait le fichier Un.jpg. Pour d'autres cultures, la bitmap était incorporée dans l'assembly satellite correspondant pendant le processus de création.
ResourceManager utilise toute donnée sérialisée, en d'autres termes les classes marquées par l'attribut Serializable et prenant en charge l'interface ISerializable. Les types intégrés incluent le type Image (et les types dérivés Bitmap, Icon, Cursor et Metafile) et les types de chaînes. Notez que les paramètres de chaîne de ResourceManager respectent le casse, ce qui signifie que les noms des fichiers de ressources et les clés de ressources respectent tous la casse.
Les fichiers peuvent se trouver dans des sous-répertoires ou dans des fichiers .resources ou être empaquetés dans des assemblys. Pour rechercher une ressource dans un assembly, ResourceManager prend le nom de l'assembly en cours d'exécution, ajoute « .resources » et son propre numéro de version Major.Minor, ajoute le paramètre régional actuel, le hachage de clé de signature pour l'assembly actuel en cours d'exécution et indique au cache de l'assembly de rechercher cet assembly. Pour une présentation d'un outil utile permettant de tracer les demandes de liaison du cache de l'assembly, consultez la documentation relative à l'Assembly Binding Log Viewer (visionneuse du journal des liaisons d'assembly) (FusLogVW) dans l'annexe B : Outils pour les ressources.
**Remarque **Si vous choisissez d'implémenter des ressources libres autonomes dans des fichiers individuels et si vous exécutez une application Web, vous pouvez être confronté au verrouillage de fichiers par les services IIS (IIS, Internet Information Services) de Microsoft, qui vous empêchera de mettre à jour les fichiers de ressources pendant l'exécution de l'application. Si, au contraire, vous placez les ressources dans des assemblys satellites dans le sous-répertoire \bin de l'application, le mécanisme de copie cachée des services IIS garantira le chargement automatique des nouvelles ressources lors de la création d'un domaine d'application pour gérer les demandes Web ultérieures.