Skip to content

Instantly share code, notes, and snippets.

@ascjones
Last active January 12, 2016 12:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ascjones/5f50b4f8e68a59437481 to your computer and use it in GitHub Desktop.
Save ascjones/5f50b4f8e68a59437481 to your computer and use it in GitHub Desktop.
Script to find conflicting .NET assembly references
// translated to F# Script from https://gist.github.com/brianlow/1553265
open System.IO
open System.Reflection
type Reference = {
Assembly : AssemblyName
ReferencedAssembly : AssemblyName
}
let getAllAssemblyRefs path = seq {
let searchDir = DirectoryInfo(path)
for file in searchDir.EnumerateFiles("*.*", SearchOption.AllDirectories) do
if file.Extension = ".exe" || file.Extension = ".dll" then
let asm = Assembly.LoadFile(file.FullName)
for referencedAsm in asm.GetReferencedAssemblies () do
yield { Assembly = asm.GetName (); ReferencedAssembly = referencedAsm }
}
let refsWithSameShortNameButDifferentFullName assemblyRefs =
assemblyRefs
|> Seq.groupBy (fun ref -> ref.ReferencedAssembly.Name)
|> Seq.filter (fun (_,refs) ->
let refCount =
refs
|> Seq.distinctBy (fun ref -> ref.ReferencedAssembly.FullName)
|> Seq.length
refCount > 1)
let printPossibleConflict (name,assemblyRefs) =
printfn "Possible conflicts for %s" name
for ref in assemblyRefs do
printfn "%s references %s" (ref.Assembly.Name.PadRight 40) (ref.ReferencedAssembly.FullName)
printfn ""
let findPossibleConflicts path exclude =
getAllAssemblyRefs path
|> Seq.filter (fun ref -> not (exclude |> Seq.exists ((=) ref.ReferencedAssembly.Name)))
|> refsWithSameShortNameButDifferentFullName
|> Seq.iter printPossibleConflict
findPossibleConflicts
@"C:\code\<solution>\<project>\bin\Debug"
["mscorlib"; "System.Core"; "System"; "System.Xml"; "FSharp.Core"]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment