Question

Je stocke un PNG en tant que ressource intégrée dans un assembly.Depuis le même assembly, j'ai un code comme celui-ci :

Bitmap image = new Bitmap(typeof(MyClass), "Resources.file.png");

Le fichier, nommé « file.png », est stocké dans le dossier « Ressources » (dans Visual Studio) et est marqué comme ressource intégrée.

Le code échoue avec une exception disant :

La ressource MyNamespace.Resources.file.png est introuvable dans la classe MyNamespace.MyClass

J'ai un code identique (dans un assembly différent, chargeant une ressource différente) qui fonctionne.Je sais donc que la technique est bonne.Mon problème est que je finis par passer beaucoup de temps à essayer de déterminer quel est le bon chemin.Si je pouvais simplement interroger (par ex.dans le débogueur) l'assembly pour trouver le bon chemin, cela m'éviterait bien des maux de tête.

Était-ce utile?

La solution

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

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

Autres conseils

Je me retrouve également à oublier comment faire cela à chaque fois, alors j'enveloppe simplement les deux one-liners dont j'ai besoin dans un petit cours :

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();
    }
}

Je suppose que votre classe se trouve dans un espace de noms différent.La manière canonique de résoudre ce problème serait d'utiliser la classe resources et une ressource fortement typée :

ProjectNamespace.Properties.Resources.file

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

J'utilise la méthode suivante pour récupérer les ressources intégrées :

    protected static Stream GetResourceStream(string resourcePath)
    {
        Assembly assembly = Assembly.GetExecutingAssembly();
        List<string> resourceNames = new List<string>(assembly.GetManifestResourceNames());

        resourcePath = resourcePath.Replace(@"/", ".");
        resourcePath = resourceNames.FirstOrDefault(r => r.Contains(resourcePath));

        if (resourcePath == null)
            throw new FileNotFoundException("Resource not found");

        return assembly.GetManifestResourceStream(resourcePath);
    }

J'appelle ensuite cela avec le chemin dans le projet :

GetResourceStream(@"DirectoryPathInLibrary/Filename")

Le nom de la ressource est l'espace de nom plus le "pseudo" espace de nom du chemin d'accès au fichier.L'espace de nom "pseudo" 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 dans l'espace de noms :mon.espace de noms.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top