Introduction
This article describes a technique that can be used in order to use resource-only assemblies within a multi-assembly project. I'm assuming that the reader is familiar with basics of assemblies and resource management under .NET. A good introduction in this topic can be found in "Resources and Localization Using the .NET Framework SDK", .NET framework tutorial.
The tutorial describes the technique of using resource files that are embedded within the application (or assembly):
using System.Resources;
[...]
ResourceManager rm = new
ResourceManager("MyNamespace.MyStrings", this.GetType().Assembly);
string someString = rm.GetString("SomeString");
In the above example we're creating an instance of ResourceManager
class. This instance will allow access to the "Strings" resource file. The second parameter specifies the assembly that embeds the resource. In this case we're specifying the assembly that contains this
class. As the second line illustrates, once the resource manager is created, it can be used to get strings or objects from the resource.
So what if the resource you're trying to use is defined in some other assembly? This case is frequent in lager projects, where the code base is separated in multiple modules. Many projects may benefit from locating its resources in separate resource-only assemblies. The sample code in this article includes two projects: a simple console application and a resource-only library. The code demonstrates how the console application accesses strings stored in the resource-only library.
In order to create ResourceManager
that corresponds to the resource in the different assembly, we need to specify the reference to the resource assembly as the second parameter in the constructor. Unfortunately Assembly
class cannot return the assembly reference based on the resource name. To work around this problem, we first need to create a dummy ResLibraryClass
class within resource assembly ResLibrary
. Now we can use the dummy class in order to obtain the reference to the resource assembly by using typeof(ResLibraryClass)
operator:
using System.Resources;
[...]
ResourceManager rm = new ResourceManager("ResouceSamlpe.Strings",
Assembly.GetAssembly(typeof(ResLibraryClass)));
string someString = rm.GetString("string1");
Here we're using static GetAssembly
method in order to obtain the reference to the assembly that embeds the resource. Also, note that you must supply the name of the resource file with its namespace, even if both the calling code and the resource file share the same namespace.