100

How can I find and delete unused references in my projects?

I know you can easily remove the using statements in vs 2008, but this doesn't remove the actual reference in your projects. The referenced dll will still be copied in your bin/setup package.

Leniel Maccaferri
  • 100,159
  • 46
  • 371
  • 480
Boris Callens
  • 90,659
  • 85
  • 207
  • 305

11 Answers11

55

*Note: see http://www.jetbrains.net/devnet/message/5244658 for another version of this answer.

Reading through the posts, it looks like there is some confusion as to the original question. Let me take a stab at it.

The original post is really asking the question: "How do I identify and remove references from one Visual Studio project to other projects/assemblies that are not in use?" The poster wants the assemblies to no longer appear as part of the build output.

In this case, ReSharper can help you identify them, but you have to remove them yourself.

To do this, open up the References inth Solution Browser, right mouse click on each referenced assembly, and pick "Find Dependent Code". See:

http://www.jetbrains.com/resharper/features/navigation_search.html#Find_ReferencedDependent_Code

You will either get:

  1. A list of the dependencies on that Reference in a browser window, or

  2. A dialog telling you "Code dependent on module XXXXXXX was not found.".

If you get the the second result, you can then right mouse click the Reference, select Remove, and remove it from your project.

While you have to to this "manually", i.e. one reference at a time, it will get the job done. If anyone has automated this in some manner I am interested in hearing how it was done.

You can pretty much ignore the ones in the .Net Framework as they don't normally get copied to your build output (typically - although not necessarily true for Silverlight apps).

Some posts seem to be answering the question: "How do I remove using clauses (C#) from a source code file that are not needed to resolve any references within that file".

In this case, ReSharper does help in a couple ways:

  1. Identifies unused using clauses for you during on the fly error detection. They appear as Code Inspection Warnings - the code will appear greyed out (be default) in the file and ReSharper will provide a Hint to remove it:

    http://www.jetbrains.com/resharper/features/code_analysis.html#On-the-fly_Error_Detection

  2. Allows you to automatically remove them as part of the Code Cleanup Process:

    http://www.jetbrains.com/resharper/features/code_formatting.html#Optimizing_Namespace_Import_Directives

Finally, realize that ReSharper does static code analysis on your solution. So, if you have a dynamic reference to the assembly - say through reflection or an assembly that is dynamically loaded at runtime and accessed through an interface - it won't pick it up. There is no substitute for understanding your code base and the project dependencies as you work on your project. I do find the ReSharper features very useful.

Răzvan Flavius Panda
  • 21,730
  • 17
  • 111
  • 169
jlo
  • 1,121
  • 1
  • 11
  • 16
  • Nice extensive answer. What's weird is that although you know I'm not referring to the using statements (that clean-up is standard in VS, don't get why R# re-invented that) you answer that question first. Would you mind switching the two around? – Boris Callens Sep 07 '09 at 13:07
  • Will do. ReSharper's feature precedes the Visual Studio implementation. It remains as it is achieved through their "autocorrect" feature - the Smart Tags are turned off when you have ReSharper. – jlo Sep 28 '09 at 21:36
  • 1
    Now ~4 years latter ReSharper 6.1 got the feature directly ! – Julien Roncaglia Feb 06 '12 at 01:43
  • Not sure what you mean - ReSharper has had this feature for years. – jlo Feb 06 '12 at 20:20
  • 8
    BE AWARE: If you use any kind of reflection to dynamically load from assemblies, this will be a bad thing to do. You will have used the "reference" to carry the assembly with you to the bin/production site, but there will be no code referencing it directly. USE WITH CARE! – Casper Leon Nielsen Feb 06 '13 at 14:39
  • One way to figure out all the references of a DLL - including dynamic ones - would be to check the dependency of the associated NuGet package (assuming it has one). For example, NHibernate DLL does not reference Iesi.Collections, but it can use it dynamically, so it is listed as a dependency on NuGet: https://www.nuget.org/packages/NHibernate/ – Răzvan Flavius Panda Nov 21 '14 at 09:57
12

you can use the 'Remove Unused References' extension I wrote:

http://visualstudiogallery.msdn.microsoft.com/9811e528-cfa8-4fe7-9dd1-4021978b5097

Spongman
  • 9,665
  • 8
  • 39
  • 58
  • this extension is not published – stombeur May 11 '11 at 10:08
  • 1
    I like this at first! But then with further testing, it removed references I needed. More details about the failure are here: http://www.wpfsharp.com/2012/04/04/how-to-find-and-remove-unused-references-in-a-c-sharp-project/ – Rhyous Apr 04 '12 at 17:07
7

Removing unused references is a feature Visual Studio 2008 already supports. Unfortunately, only for VB .NET projects.

I have opened a suggestion on Microsoft Connect to get this feature for C# projects too:

http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=510326

If you like this feature as well then you might vote my suggestion.

jbe
  • 6,976
  • 1
  • 43
  • 34
5

Try this one: Reference Assistant

Summary

Reference Assistant helps to remove unused references from C#, F#, VB.NET or VC++/CLI projects in the Visual Studio 2010.

Leniel Maccaferri
  • 100,159
  • 46
  • 371
  • 480
4

ReSharper 6.1 will include these features:

  • Optimize references: analyze your assembly references and their usages in code, get list of redundant references and remove them.

  • Remove Unused References: quick refactoring to remove redundant assembly references.

  • Safe delete on assembly references: will delete assembly references if all of them are redundant, otherwise dispalies usages and can remove only redundant assembly references of the selected list.

Pang
  • 9,564
  • 146
  • 81
  • 122
Kirill Skrygan
  • 203
  • 2
  • 8
4

ReSharper will do this for you (and so so much more!)

Pang
  • 9,564
  • 146
  • 81
  • 122
Chris Canal
  • 4,824
  • 9
  • 35
  • 45
3

I done this without extension in the VS 2010 Ultimate Architecture->Generate Dependency Graph->By Assembly, it shows used assemblies, and manually removed unused references.

mes
  • 3,581
  • 29
  • 28
  • I don't recommend this for a larger project. I found it very difficult to discern what was and wasn't used. I also happen to be color blind however, so that likely affected the usefulness of this to me. – DubiousPusher Jan 06 '15 at 22:37
3

I have a free answer that works in any version of Visual Studio and any Framework version. It doesn't remove the unused references, but it identifies them.

You can use Telerik JustDecompile on your project dll. Just open the dll in JustDecompile and go under References to see what is actually used in the compiled dll.

enter image description here

toddmo
  • 20,682
  • 14
  • 97
  • 107
  • 1
    I think that's a great solution! Do you write VS plugins? :) ILSpy has a plugin, and I'm going to see if it can be easily semi-automated somehow ... – Steven Coco Apr 23 '19 at 04:12
  • @StevenCoco I haven't in a long time but the IDE api is pretty straight-forward with lots of good examples out on the internet. Good luck and update us with your project if you get it done! – toddmo Apr 23 '19 at 14:11
0

Given that VisualStudio (or is it msbuild?) detects unused references and doesn't include them in the output file, you can write a script which parses the references out of the csproj, and compares that with the referenced Assemblies detected by reflexion on the project output.

If you're motivated...

Benjol
  • 63,995
  • 54
  • 186
  • 268
  • 1
    This is not always correct. For example, if you have class Foo which derives from Bar, and you have static member Blah in Bar, and you call it as Foo.Blah, then you have to have assembly of Foo in references for compiler, but it will not be emitted into output, because static member is in Bar. There are some more cases like this. – Ilya Ryzhenkov Sep 05 '09 at 12:27
  • Yeah, I had noticed some 'holes' in my script, never got round to working out why. Thanks for the info. – Benjol Sep 07 '09 at 05:31
0

I think that are copied in bin\, because in the project that removed the reference have reference o other project that have the same reference...

hdmq
  • 277
  • 1
  • 4
  • 14
0

If you know which references are not used you can remove them manually.
In Solution Explorer, right-click the reference in the References node, and then click Remove.

fat
  • 6,435
  • 5
  • 44
  • 70