using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; //using Microsoft.VisualStudio.TestTools.UnitTesting; namespace GSF.Web.Tests { //[TestClass] public class UtilityTest { //[TestMethod] public void FindConflictingReferences() { string path = @"C:\Projects\gsf\Build\Output\Debug\Libraries\Web\"; System.Console.WriteLine("Target Path = " + path); List assemblies = GetAllAssemblies(path); List references = GetReferencesFromAllAssemblies(assemblies); IEnumerable> groupsOfConflicts = FindReferencesWithTheSameShortNameButDiffererntFullNames(references); foreach (IGrouping group in groupsOfConflicts) { System.Console.WriteLine("Possible conflicts for {0}:", group.Key); foreach (Reference reference in group) { System.Console.WriteLine("{0} references {1}", reference.Assembly.Name.PadRight(25), reference.ReferencedAssembly.FullName); } } } private IEnumerable> FindReferencesWithTheSameShortNameButDiffererntFullNames(List 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 GetReferencesFromAllAssemblies(List assemblies) { List references = new List(); foreach (Assembly assembly in assemblies) { foreach (AssemblyName referencedAssembly in assembly.GetReferencedAssemblies()) { references.Add(new Reference { Assembly = assembly.GetName(), ReferencedAssembly = referencedAssembly }); } } return references; } private List GetAllAssemblies(string path) { List files = new List(); DirectoryInfo directoryToSearch = new DirectoryInfo(path); files.AddRange(directoryToSearch.GetFiles("*.dll", SearchOption.AllDirectories)); files.AddRange(directoryToSearch.GetFiles("*.exe", SearchOption.AllDirectories)); return files.ConvertAll(file => { try { return Assembly.LoadFile(file.FullName); } catch { return null; } }) .Where(assembly => assembly != null) .ToList(); } private class Reference { public AssemblyName Assembly { get; set; } public AssemblyName ReferencedAssembly { get; set; } } } }