I recently created a Visual Studio shared project so that I could share
source code between several projects I am working on. In the past I had
created class libraries to share code between multiple projects. The
shared project approach differs from the class library in that rather than
sharing compiled code it shares the source code. This approach permits
using conditional compilation so that you can target different platforms.
I had the need to share several bitmap images as well as source code so I
included them in the shared project. I marked them as embedded resources
so that they would be compiled into each project that references the
shared project. The next question was how to reference and load the
embedded bitmap resources. Here's what I came up with.
To embed images in a shared project as resources you need to follow these
steps.
- Add the image to the shared project by right clicking on the project
and choosing add/existing item. I like to create a folder in the project
for the images, but that isn't required.
- Select the properties for the bitmap image and change the build action
to embedded resource
Now that the image(s) are embedded as resources, we need to be able to
reference and load those images. We can reference them by name, but we
need the full path rather than just the resource name. So we need a way to
convert the image file name to the full path to the resource.
The first thing I did was to find a way to list the full path name for
all of the embedded resources. That turned out to be reasonably easy. The
following code gets the full path names as an array of strings.
Assembly myAssembly = Assembly.GetExecutingAssembly();
string[] resourceNames = myAssembly.GetManifestResourceNames();
The above code returns the full path to all of the resources within the
compiled executable. I now needed a way to convert from the bitmap file
name that the application uses to reference the resource to the full
resource path name. I did that as follows.
string resource = "your-image-name-goes-here";
return Array.Find(resourceNames, delegate (string name) { return name.Contains(resource); });
The final step was to create a bitmap from the embedded resource. The
following code is a class I created that encapsulates everything I needed
to be able to load a bitmap from an embedded bitmap resource. It includes
the code snippets from above.
public class ResourceLoader
{
// Get a list of embedded resources
public static string[] ResourceNames
{
get
{
Assembly myAssembly = Assembly.GetExecutingAssembly();
return myAssembly.GetManifestResourceNames();
}
}
// Get the full path for a resource name
public static string GetResourceFullPath(string resource)
{
return Array.Find(ResourceNames, delegate (string name) { return name.Contains(resource); });
}
// Get the embedded resource as a bitmap
public static Bitmap LoadBitmapResource(string bitmapName)
{
Bitmap result = null;
string fullPath = GetResourceFullPath(bitmapName);
if (!string.IsNullOrEmpty(fullPath))
{
Assembly myAssembly = Assembly.GetExecutingAssembly();
using (Stream myStream = myAssembly.GetManifestResourceStream(fullPath))
{
result = new Bitmap(myStream);
}
}
return result;
}
}
I hope you find this helpful.