Skip to content

Instantly share code, notes, and snippets.

@brianlow
Created January 3, 2012 03:04
Show Gist options
  • Select an option

  • Save brianlow/1553265 to your computer and use it in GitHub Desktop.

Select an option

Save brianlow/1553265 to your computer and use it in GitHub Desktop.

Revisions

  1. brianlow renamed this gist Jan 3, 2012. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  2. brianlow created this gist Jan 3, 2012.
    76 changes: 76 additions & 0 deletions gistfile1.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,76 @@
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Reflection;
    using NUnit.Framework;

    namespace MyProject
    {
    [TestFixture]
    public class UtilityTest
    {
    [Test]
    public void FindConflictingReferences()
    {
    var assemblies = GetAllAssemblies(@"E:\dev\myapp\myproject\bin\debug");

    var references = GetReferencesFromAllAssemblies(assemblies);

    var groupsOfConflicts = FindReferencesWithTheSameShortNameButDiffererntFullNames(references);

    foreach (var group in groupsOfConflicts)
    {
    Console.Out.WriteLine("Possible conflicts for {0}:", group.Key);
    foreach (var reference in group)
    {
    Console.Out.WriteLine("{0} references {1}",
    reference.Assembly.Name.PadRight(25),
    reference.ReferencedAssembly.FullName);
    }
    }
    }

    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; }
    }

    }
    }