How do I determine the dependencies of a .NET application?

Viewed 164651

How do I determine the dependencies of a .NET application? Does Dependency Walker work with managed apps? I've downloaded the latest and tried profiling the app, but it just exits without much of an explanation. If it doesn't work with .NET, then is there some other tool that would help me debug a run-time DLL loading issue?

12 Answers

Dependency walker works on normal win32 binaries. All .NET dll's and exe's have a small stub header part which makes them look like normal binaries, but all it basically says is "load the CLR" - so that's all that dependency walker will tell you.

To see which things your .NET app actually relies on, you can use the tremendously excellent .NET reflector from Red Gate. (EDIT: Note that .NET Reflector is now a paid product. ILSpy is free and open source and very similar.)

Load your DLL into it, right click, and chose 'Analyze' - you'll then see a "Depends On" item which will show you all the other dll's (and methods inside those dll's) that it needs.

It can sometimes get trickier though, in that your app depends on X dll, and X dll is present, but for whatever reason can't be loaded or located at runtime.

To troubleshoot those kinds of issues, Microsoft have an Assembly Binding Log Viewer which can show you what's going on at runtime

To browse .NET code dependencies, you can use the capabilities of the tool NDepend. The tool proposes:

For example such query can look like:

from m in Methods 
let depth = m.DepthOfIsUsing("NHibernate.NHibernateUtil.Entity(Type)") 
where depth  >= 0 && m.IsUsing("System.IDisposable")
orderby depth
select new { m, depth }

And its result looks like: (notice the code metric depth, 1 is for direct callers, 2 for callers of direct callers...) (notice also the Export to Graph button to export the query result to a Call Graph)

NDepend dependencies browsing through C# LINQ query

The dependency graph looks like:

NDepend Dependency Graph

The dependency matrix looks like:

NDepend Dependency Matrix

The dependency matrix is de-facto less intuitive than the graph, but it is more suited to browse complex sections of code like:

NDepend Matrix vs Graph

Disclaimer: I work for NDepend

Enable assembly binding logging set the registry value EnableLog in HKLM\Software\Microsoft\Fusion to 1. Note that you have to restart your application (use iisreset) for the changes to have any effect.

Tip: Remember to turn off fusion logging when you are done since there is a performance penalty to have it turned on.

Providing a Solution for Updated .Net Versions

This may not have been the case when the OP asked the question, but there is currently a built-in dotnet command for listing the package dependencies within a solution:

    PS C:\foo> dotnet list package
    Project 'foo' has the following package references
        [net5.0]:
        Top-level Package               Requested    Resolved
        ...                             ...          ...

More information can be found on the Microsoft docs website: https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-list-package

At my company we use "Assembly Information" by Ashutosh Bhawasinka. It is implemented as a shell extension, so you just right-click on the *.dll file and you get the information. You can see a dependency tree OR get a flat list of all the dependencies. What I like about this tool is that it also shows the Public Key Token which is a good way to check for conflicts. Here is an example of the flat list output of one of my company's assemblies:

ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=neutral, PublicKeyToken=484f84ea1d6cf4da
mscorlib, Culture=neutral, PublicKeyToken=b77a5c561934e089
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

We compiled in .Net Framework 4.0, so you can see that with the version on mscorlib; we are also referencing SharpZipLib which was compiled for .Net Framework 2.0 so we see that dependency also. Nice.

The only problem is that the utility was posted on CodePlex which was shut down. Thankfully, we kept a copy of the original files. I can't find it anywhere else on the web, so I've decided to post it here for anyone to get a copy of (looks like we only saved the 64 bit version):

http://riosoftware.com/temp/pub/Assembly%20Information%20for%2064bit%20Operating%20System.zip

Related