Skip to content

Instantly share code, notes, and snippets.

@tiesmaster
Forked from brianlow/FindConflictingReferences.cs
Last active September 9, 2015 08:27
Show Gist options
  • Save tiesmaster/11fa2911afb2d611efe3 to your computer and use it in GitHub Desktop.
Save tiesmaster/11fa2911afb2d611efe3 to your computer and use it in GitHub Desktop.
Find conflicting assembly references
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace MyProject
{
[TestClass]
public class UtilityTest
{
[TestMethod]
public void FindConflictingReferences()
{
var assemblies = GetAllAssemblies(@"C:\Users\t.brobbel\src\coolblue\common\coolkit\Tests\Coolblue.Wpf.Toolkit.Tests\bin\Debug");
var references = GetReferencesFromAllAssemblies(assemblies);
var groupsOfConflicts = FindReferencesWithTheSameShortNameButDiffererntFullNames(references);
var sb = new StringBuilder();
foreach (var group in groupsOfConflicts)
{
sb.AppendLine($"Possible conflicts for {group.Key}:");
foreach (var reference in group)
{
sb.AppendLine($"{reference.Assembly.Name.PadRight(25)} references {reference.ReferencedAssembly.FullName}");
}
}
sb.ToString().Should().BeEmpty();
}
private IEnumerable<IGrouping<string, Reference>> FindReferencesWithTheSameShortNameButDiffererntFullNames(List<Reference> references)
{
return from reference in references
group reference by reference.ReferencedAssembly.Name
into referenceGroup
where referenceGroup.ToList().Select(reference => reference.ReferencedAssembly.FullName).Distinct().Count() > 1
select referenceGroup;
}
private List<Reference> GetReferencesFromAllAssemblies(List<Assembly> assemblies)
{
var references = new List<Reference>();
foreach (var assembly in assemblies)
{
foreach (var referencedAssembly in assembly.GetReferencedAssemblies())
{
references.Add(new Reference
{
Assembly = assembly.GetName(),
ReferencedAssembly = referencedAssembly
});
}
}
return references;
}
private List<Assembly> GetAllAssemblies(string path)
{
var files = new List<FileInfo>();
var directoryToSearch = new DirectoryInfo(path);
files.AddRange(directoryToSearch.GetFiles("*.dll", SearchOption.AllDirectories));
files.AddRange(directoryToSearch.GetFiles("*.exe", SearchOption.AllDirectories));
return files.ConvertAll(file => Assembly.LoadFile(file.FullName));
}
private class Reference
{
public AssemblyName Assembly { get; set; }
public AssemblyName ReferencedAssembly { get; set; }
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment