Advanced resource debugging with Resview

In an earlier blog about resource fallback essentials, I said that the resource diagnostic tool resview is included with the framework sdk. That was wrong – it turns out we previously released resview as a gotdotnet sample, but it’s no longer accessible.

Since resview is helpful in our own investigations, we decided to re-release resview on code gallery [download resview].

About Resview

Resview looks specifically for resource embedding problems that can result in runtime resource lookup problems. It can tell you about critical errors; for example, if the assembly is missing resources or the embedded resource file name is incorrect. It also gives warnings about best practices – for example, reminding you to include NeutralResourcesLanguagesAttribute.

How to use resview

You can run resview on a .resources file, a main assembly, or a satellite assembly. Let’s run resview on assemblies from the ResourceManagerSample project, mentioned in the previous blog.

To view the resources embedded in the main assembly, run “resview Fallback.exe”.

To view the resources embedded in a satellite assembly, run “resview FallbackTest.resources.dll” on any of the satellite assemblies.

 

Let’s look at the output when running on the main assembly. I’ve added numbers to the end of interesting lines, which will be described afterwards.

 

ResourceManagerSample>resview FallbackTest.exe

Microsoft (R) Visual .resources Viewer Version 1.83 [CLR version 4.0.20209.0]

FallbackTest.exe is a main assembly.

ResView : warning: This assembly does not have a NeutralResourcesLanguageAttribute.

Using this attribute gives a slight perf optimization for one culture, and

is required for localizable ClickOnce apps. (1)

Public key token: null [This must not be a shipping binary] (2)

Processing FallbackStrings.resources... (3)

Resources from FallbackStrings.resources...

greeting = hello

eow = weekend

Found 2 resources in FallbackStrings.resources. (4)

Found 1 resource file, with a total of 2 resources.

Encountered 0 errors, 1 warning.

Total size of all .resources files: 244

Total length of keys (chars): 11 Average: 5.5

Total length of String values (chars): 12 Average: 6.0

Number of Strings: 2 Byte[]'s: 0 Streams: 0 Others: 0

# of unique Types: 1

file est. overhead: 221 bytes 110.5 bytes/resource 90.6% of the file

Output time: 31 ms

This tells us the following:

1. The main assembly didn’t use the NeutralResourcesLanguageAttribute. We strongly recommend that you add this attribute. About the NeutralResourcesLanguageAttribute.

2. There’s no public key token. This serves as a reminder, in case your assembly needs a strong name.

3. Resview found an embedded resources file named FallbackStrings.resources.

4. Lists the resources in that file

In addition to the general diagnostic information resview provides (for example, if the files were named incorrectly), 3 and 4 combined can be useful for debugging resource failures. For example, if you get an error during resource lookup, you can check whether the resources file the ResourceManager is searching for is actually embedded in the assembly. If so, you can check whether the key/value pair is actually in the resources file.