views:

896

answers:

9

I am working with a very big project (a solution that contains 16 projects and each project contains about 100 files).

It is written in C++/C# with Visual Studio 2005.
One of the projects has around 2000 resources out of which only 400 are actually used.
How do I remove those unused resources?

I tried to accomplish the task by searching for used ones.
It worked and I was able to build the solution, but it broke at runtime.

I guess because enum*s are used. (*IMPORTANT)

How can I make sure that it doesn't break at runtime?

EDIT:
I think one method could be to generate the resource (that is not found) on the fly at runtime (somehow).
But I have no idea about ... anything.

NOTE: It's okay if a few unnecessary resources are still there.

A: 

Maybe Find Unused Resources in a .NET Solution helps here? Basically, you'll have to check which resources are used (e.g. by comprehensive code coverage checks) and remove the unused ones.

And probably you should not be afraid by using the trail-and-error approach to cleaning up.

MP24
I did just this. But :(
TheMachineCharmer
+1  A: 

You can use third party plug-in for Visual Studio as ReSharper. This add-in will analyze your C# code and point out unused resources. But it only works with C#.

Patrice Bernassola
A: 

For C++ projects, check out The ResOrg from Riverblade.

"The Resource ID Organiser (ResOrg for short) is an Add-in for Visual C++ designed to help overcome one of the most annoying (and unnecessary) chores of developing/maintaining Windows applications - maintaining resource symbol ID values"

http://www.riverblade.co.uk/products/resorg/index.html

Lior Kogan
A: 

In the Solution Explorer, right click and on a Reference and click on the menu item Find Dependent Code.

If it can't find any dependent code then you can remove this reference from the project. (The Remove operation is also under the right-click menu.)

EDIT: For a large project, the Find Dependent Code operation will take a long time. So since you have 2000 resources and most likely value your time this probably is not a viable option....

Chris
+1  A: 

I've never had one that bad. My method in compiled programs is to use a REXX script which emulates GREP looking for references to source that I suspect is not being used, remove them from the program and see what breaks. I use the REXX script because I can pre-filter the list of files I want to search. Which allows me to do a search across folders and computers.

Dave
+1  A: 

You may want to take a look at the tool Reflector (free), not to be confused with ReSharper (expensive). It can show you which DLLs are dependent on another. Then if you want you may be able to remove the DLL that is not being referenced by anything else. Watch out if you are using dependency injection or reflection which then could break your code without your knowledge.

Reflector: http://www.red-gate.com/products/reflector/.

This add-in draws assembly dependency graphs and IL graphs: http://reflectoraddins.codeplex.com/Wiki/View.aspx?title=Graph.

AndrewB
A: 

If your code contains dynamic loading of resources (e.g. via strings) at runtime, then there is no way to automatically determine which resources can be safely removed from the source. A dynamic loading statement could load any resource.

Your best bet is to start with your trimmed down version of the app, run it, and identify which resources are missing when you test it. Then add them back in and retest.

Daniel Earwicker
A: 

For C++ resources, did you try right-clicking the project in "Resource View" and then deleting the ones which do not have a tick mark next to them? It is unsafe to delete unused dialog resources since they are referenced as "enum"s in code (like the following).

enum { IDD = IDD_ABOUTBOX };

..however for all the others it should be safe.

Ugur Turan
+1  A: 

What I would do is write a custom tool to search your source code.

If you remove a resource ID from a header file (i.e. possibly called resource.h) and then recompile and get no warnings: then that's a good thing.

Here is how I would go about writing the app. Take as input the resource file (resource.h) you want to scrutinize. Open the header file (*.h) and parse all the resource constants (Or at least the onces you are interested in). Store those in a hash table for quick look up later. For each code file in your project, search the text for instances of each of your resource ID's. When a resource ID is used, increment the value in the hash table otherwise leave it at zero. At the end, dump all the resource ID's that are zero out a log file or something. Then test that indeed you can remove those specified resource ID's safely. Once you do that, then write another tool that removes the specified resource ID's given the results of your log file.

You could write such a tool in perl and it would execute in about 0.3 seconds: But would take days to debug. :) Or you could write this in .NET, and it would execute a little slower, but would take you an hour to debug. :)

C Johnson
Very cool :-) +1A
TheMachineCharmer