Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Using Resource-only Assemblies with C#

0.00/5 (No votes)
17 Apr 2002 1  
This note describes how to use resource-only assemblies with C# in the context of a multi-assembly project.

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.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here