Dump .NET References

An application that I work on has many (in excess of 50) referenced custom .NET assemblies. Most of the custom assemblies follow the same version number scheme – but not all of them. And at either the beginning or end of a release cycle, the version numbers change and it can be difficult to track and ensure you have the proper assemblies referenced.

Red Gate’s .NET Reflector is a nice tool to examine an assembly but I need a way to plow through my bin folder and log all of my custom assemblies referenced assemblies, including the version numbers.

The code below does that. (Full disclosure, this code is a mixture of a couple of examples I found on the internet made to work for my situation.)

All of my custom assemblies have a distinct naming convention so I call the CollectAndLogReferences method with this regular expression “^(AAA|AAB|AAC)” to filter only my custom dlls and executables. With the filtering like this, I don’t log all of the system dlls and others that I don’t care about.

I paste the output (which is a lot of text) into my text editor. From there, I can easily search, sort, etc. as needed.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
...
CollectAndLogReferences("^(AAA|AAB|AAC)");
 
 
public void CollectAndLogReferences(string sReferenceExpression)
{
	var sRefExp = "^(.)";
	if (sReferenceExpression.Length > 0) 
		sRefExp = sReferenceExpression;
 
	int indent = 0;
	var loggedAssembly = new List<string>();
	var referencedAssembly = new List<string>();
 
	var p = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
	var files = Directory.GetFiles(p, "*.*").Where(f => f.EndsWith(".exe") || f.EndsWith(".dll"));
	foreach (string file in files)
	{
		try
		{
			var assembly = Assembly.LoadFile(file);
			if (!Regex.IsMatch(assembly.FullName, sRefExp))
				continue;
 
			if (!referencedAssembly.Contains(assembly.FullName))
				referencedAssembly.Add(assembly.FullName);
		}
		catch (Exception e) { }
	}
 
	while (referencedAssembly.Count > 0)
	{
		LogAssemblies(indent, sRefExp, loggedAssembly, referencedAssembly);
	}
}
 
 
public void LogAssemblies(int indent, string sRefExp, List<string> logged, List<string> referenced)
{
	Display(indent, "");
	var referencedAssembly2 = new List<string>();
	foreach (var refd in referenced)
	{
		if (logged.Contains(refd)) continue;
		try
		{
			Assembly r = Assembly.Load(refd);
			Display(indent, "Assembly: {0}", r);
			Display(indent, "Referenced assemblies:");
			foreach (AssemblyName an2 in r.GetReferencedAssemblies())
			{
				if (Regex.IsMatch(an2.Name, sRefExp))
				{
					Display(indent + 1, "Name={0}, Version={1}, Culture={2}, PublicKeyToken={3}", 
						an2.Name, an2.Version, an2.CultureInfo.Name, (BitConverter.ToString(an2.GetPublicKeyToken())));
					if (!referencedAssembly2.Contains(an2.FullName))
						referencedAssembly2.Add(an2.FullName);
				}
			}
			logged.Add(r.FullName);
			Display(indent, "");
		}
		catch (Exception e)
		{
			Display(indent, "EXCEPTION DUMP BEGIN * * * *");
			Display(indent, refd);
			Display(indent, e.ToString());
			Display(indent, "EXCEPTION DUMP END * * * * *");
		}
	}
 
	referenced.Clear();
	referenced.AddRange(referencedAssembly2);
}
 
 
public void Display(int indent, string format, params object[] param)
{
	var str = string.Format(format, param);
	//Output.Text += new string(' ', indent * 2);
	//Output.Text += str + Environment.NewLine;
	Console.Write(new string(' ', indent * 2));
	Console.WriteLine(str);
}

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.