tags:

views:

2307

answers:

4

I am storing a PNG graphic as an Embedded Resource in an assembly.

From within the same assembly I have some code like:

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

The file, named "file.png" is stored in the "Resources" folder (within Visual Studio), and is marked as an embedded resource.

The code fails with an exception saying:
"Resource MyNamespace.Resources.file.png cannot be found in class MyNamespace.MyClass".

I have identical code (in a different assembly, loading a different resource) which works. So I know the technique is sound. My problem is I end up spending a lot of time trying to figure out what the correct path is. If I could simply query (eg. in the debugger) the assembly to find the correct path, that would save me a load of headaches.

Thanks, Rob

+5  A: 

I' guessing that your class is in a different namespace. The canonical way to solve this would be to use the resources class and a strongly typed resource:

ProjectNamespace.Properties.Resources.file

Use the IDE's resource manager to add resources.

Konrad Rudolph
+9  A: 

This will get you a string array of all the resources:

System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();
John
You have a typo. It should be GetExecutingAssembly() instead of GetExecutingAssembly. It's a method, not a property.
Ecyrb
Thanks, updated.
John
+1  A: 

@Konrad You are right, my class is in a different namespace. It seems that the Resources folder lives under the namespace specified as the default namespace in the project configuration, which for various reasons isn't the namespace that this class is part of.

I suspect you're correct also about using a different approach entirely, but as I need to be consistent with legacy code, that's beyond my control.

Rob
+5  A: 

I find myself forgetting how to do this every time as well so I just wrap the two one-liners that I need in a little class:

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