18 votes

Confusion sur les ressources et GetManifestResourceNames()

J'ai appris à connaître les ressources en C# et l'IDE Visual C#. Je ne sais plus où j'en suis. J'ai lu quelques pages sur StackOverflow, comme celle-ci how-to-get-the-path-of-an-embebbed-resource et la documentation de Microsoft, mais cela m'a laissé perplexe.

Ma première question est de savoir ce que sont les ressources : s'agit-il du fichier .resources ou des fichiers qu'il contient, comme les icônes.

Deuxièmement, lorsque j'utilise la méthode GetManifestResourceNames, est-ce que j'obtiens les noms des fichiers .resources ou les noms des fichiers qu'ils contiennent ? Lorsque je l'utilise dans mon programme, je n'obtiens que les fichiers .resources, mais en lisant des sujets comme ce loop-through-all-the-resources-in-a-resx-file , j'ai l'impression que je devrais obtenir les noms des fichiers à l'intérieur du fichier .resources.

Est-ce moi, ou cette terminologie est-elle vraiment un peu confuse ? Quelqu'un peut-il la rendre un peu plus claire ? Merci de votre aide.

17voto

Felice Pollano Points 20105

Les ressources sont des fichiers que vous compilez en les marquant comme "EmbeddedResource", ce qui permet de fusionner le fichier dans l'assemblage. GetManifestResourceNames() est juste un énumérateur qui nous donne le nom de tous les fichiers de ressources compilées intégrés, par exemple MyAssembly.resources . Les éléments de ressources proprement dits doivent être énumérés au moyen d'un fichier ResourceSet qui charge ce fichier de ressources.

13voto

Tejas Sharma Points 1920

Je ne sais pas si vous avez encore besoin de la réponse à cette question, mais d'après mon expérience GetManifestResourceNames() renvoie les noms des .resource intégrés dans votre assemblage.

Si vous souhaitez accéder aux ressources individuelles, vous pouvez faire quelque chose du genre :

Assembly assembly = Assembly.LoadFrom(assemblyName);
string[] names = assembly.GetManifestResourceNames();
ResourceSet set = new ResourceSet(assembly.GetManifestResourceStream(names[0]));
foreach (DictionaryEntry resource in set)
{
    Console.WriteLine("\n[{0}] \t{1}", resource.Key, resource.Value); 
}

10voto

Zack Points 1901

J'ai réussi à faire fonctionner mon projet grâce à la réponse de Felice Pollano. J'ai ajouté un dossier à ma solution appelé Images, et j'ai ouvert ce dossier dans l'explorateur Windows, puis j'ai copié mon fichier image dans le dossier Images. Ensuite, je suis allé dans Visual Studio et j'ai cliqué sur "Afficher tous les fichiers" en haut de l'explorateur de solutions, puis j'ai fait un clic droit sur le fichier image dans le dossier Images et j'ai cliqué sur "Inclure dans le projet". Ensuite, j'ai fait un clic gauche sur le fichier image dans l'explorateur de solutions, et dans la fenêtre Propriétés, j'ai réglé l'action de construction sur Embedded Resource comme vous l'avez mentionné.

Voici le code dans lequel j'ai accédé à cette image

private Dictionary<int, Image> GetImages()
{
  List<Stream> picsStrm = new List<Stream>();

  Assembly asmb = Assembly.GetExecutingAssembly();
  string[] picNames = asmb.GetManifestResourceNames();

  foreach (string s in picNames)
  {
    if (s.EndsWith(".png"))
    {
      Stream strm = asmb.GetManifestResourceStream(s);
      if (strm != null)
      {
        picsStrm.Add(strm);
      }
    }
  }

  Dictionary<int, Image> images = new Dictionary<int, Image>();

  int i = 0;

  foreach (Stream strm in picsStrm)
  {
    PngBitmapDecoder decoder = new PngBitmapDecoder(strm,
      BitmapCreateOptions.PreservePixelFormat,
      BitmapCacheOption.Default);
    BitmapSource bitmap = decoder.Frames[0] as BitmapSource;
    Image img = new Image();
    img.Source = bitmap;
    img.Stretch = Stretch.UniformToFill;
    images.Add(i, img);
    i++;

    strm.Close();
  }
  return images;
}

Ce qui est en fait un extrait de cet article(Une application de chat WCF-WPF) par Islam ElDemery

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X