Frage

Ich speichere ein PNG als eingebettete Ressource in einer Assembly.Aus derselben Assembly 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:

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

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

War es hilfreich?

Lösung

Dadurch erhalten Sie ein String-Array aller Ressourcen:

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

Andere Tipps

Ich vergesse auch jedes Mal, wie man das macht, also packe ich einfach die beiden Einzeiler, die ich brauche, in einen kleinen Kurs ein:

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

Ich vermute, dass sich Ihre Klasse in einem anderen Namespace befindet.Der kanonische Weg, dieses Problem zu lösen, wäre die Verwendung der Ressourcenklasse und einer stark typisierten Ressource:

ProjectNamespace.Properties.Resources.file

Verwenden Sie den Ressourcenmanager der IDE, um Ressourcen hinzuzufügen.

Ich verwende die folgende Methode, um eingebettete Ressourcen abzurufen:

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

Das rufe ich dann mit dem Pfad im Projekt auf:

GetResourceStream(@"DirectoryPathInLibrary/Filename")

Der Name der Ressource ist der Namensraum plus der „Pseudo“-Namensraum des Pfads zur Datei.Der „Pseudo“-Namensraum wird durch die Unterordnerstruktur mit \ (Backslashes) anstelle von erstellt.(Punkte).

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

Der folgende Aufruf:

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

gibt den Stream von my.xml zurück, der sich in der Ordnerstruktur resources\xml im Namensraum befindet:mein.namespace.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top