[c#] Wie kann ich den "Pfad" einer eingebetteten Ressource erkennen?



1 Answers

Ich merke auch, wie ich das jedes Mal vergesse, also verpacke ich einfach die zwei Einzeiler, die ich in einer kleinen Klasse brauche:

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

Ich speichere ein PNG als eingebettete Ressource in einer Assembly. Innerhalb derselben Baugruppe habe ich einen Code wie diesen:

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

Die Datei mit dem Namen "file.png" wird im Ordner "Resources" (in Visual Studio) gespeichert und als eingebettete Ressource markiert.

Der Code schlägt mit einer Ausnahme fehl, die besagt:

Ressource MyNamespace.Resources.file.png kann nicht in der Klasse MyNamespace.MyClass gefunden werden

Ich habe identischen Code (in einer anderen Assembly, Laden einer anderen Ressource), die funktioniert. Also ich weiß, dass die Technik solide ist. Mein Problem ist, dass ich am Ende viel Zeit damit verbringe herauszufinden, was der richtige Weg ist. Wenn ich die Assembly einfach abfragen könnte (zB im Debugger), um den richtigen Pfad zu finden, würde mir das eine Menge Kopfschmerzen ersparen.




Ich verwende die folgende Methode, um eingebettete Ressourcen zu erfassen:

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

Ich rufe das dann mit dem Pfad im Projekt an:

GetResourceStream(@"DirectoryPathInLibrary/Filename")



Related