118 votes

Comment puis-je découvrir le "chemin" d'une ressource incorporée?

Je suis le stockage d'une image PNG en tant que Ressource Incorporée dans une assemblée.

De la même assemblée j'ai un code comme:

Image Bitmap = new Bitmap(typeof(Maclasse), "les Ressources.fichier.png");

Le fichier nommé "fichier.png", est stockée dans la rubrique "Ressources" du dossier (dans Visual Studio), et est marquée comme une ressource incorporée.

Le code ne fonctionne pas avec une exception en disant:
"Ressources MyNamespace.Les ressources.fichier.png est introuvable dans la classe MyNamespace.MyClass".

J'ai un code identique (dans une autre assemblée, le chargement d'une ressource différente) qui fonctionne. Donc, je sais que la technique est bonne. Mon problème est que j'ai passé beaucoup de temps à essayer de comprendre ce que le chemin d'accès correct. Si je pouvais simplement requête (par exemple. dans le débogueur) l'assemblée à trouver le bon chemin, que me sauver une charge de maux de tête.

Merci, Rob

212voto

John Points 9543

Cela vous donnera un tableau de chaînes de toutes les ressources:

 System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();
 

48voto

Dylan Points 1065

Je me retrouve à oublier comment faire cela à chaque fois aussi, alors je viens d'envelopper les deux one-liners dont j'ai besoin dans une petite classe:

 public class Utility
{
    /// <summary>
    /// Takes the full name of a resource and loads it in to a stream.
    /// </summary>
    /// <param name="resourceName">Assuming an embedded resource is a file
    /// called info.png and is located in a folder called Resources, it
    /// will be compiled in to the assembly with this fully qualified
    /// name: Full.Assembly.Name.Resources.info.png. That is the string
    /// that you should pass to this method.</param>
    /// <returns></returns>
    public static Stream GetEmbeddedResourceStream(string resourceName)
    {
        return Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName);
    }

    /// <summary>
    /// Get the list of all emdedded resources in the assembly.
    /// </summary>
    /// <returns>An array of fully qualified resource names</returns>
    public static string[] GetEmbeddedResourceNames()
    {
        return Assembly.GetExecutingAssembly().GetManifestResourceNames();
    }
}
 

19voto

Konrad Rudolph Points 231505

Je devine que votre classe est dans un espace de noms différent. Le moyen canonique de résoudre ce problème consiste à utiliser la classe de ressources et une ressource fortement typée:

 ProjectNamespace.Properties.Resources.file
 

Utilisez le gestionnaire de ressources de l'EDI pour ajouter des ressources.

4voto

user3356450 Points 11

Le nom de la ressource est l’espace de nom plus l’espace de nom "pseudo" du chemin du fichier. Le pseudo-espace de noms est créé par la structure de sous-dossiers en utilisant \ (barres obliques inverses) au lieu de. (points).

 public static Stream GetResourceFileStream(String nameSpace, String filePath)
{
    String pseduoName = filePath.Replace('\\', '.');
    Assembly assembly = Assembly.GetExecutingAssembly();
    return assembly.GetManifestResourceStream(nameSpace + "." + pseduoName);
}
 

L'appel suivant:

 GetResourceFileStream("my.namespace", "resources\\xml\\my.xml")
 

renverra le flux de my.xml situé dans la structure de dossiers resources \ xml de l'espace de noms: my.namespace.

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