Now lets say one day you come to work and start in a new branch and find the System.Reflection.CustomAttributeFormatException after comping a new. And you begin asking your self how did I get here and what have I done this is not my beautiful house this is not my large automobile. After answering those questions and more colleague and I found someone added a rouge reference to a DLL in another branch. Initially this involved some meticulous evaluation of each project and its references.
I offer you a magnet for your needle in the hay stack the code below can be pasted in to a visual studio macro to scan each project and make sure it is referencing the correct path. (Your paths may vary)
Imports System
Imports System.Diagnostics
Imports EnvDTE
Imports VSLangProj
Imports System.Collections
Public Module ReferenceScanner
Private Path As String
Private ExcludedPaths As ArrayList
Private Sub Scan(ByVal project As Project)
If Not project.ProjectItems Is Nothing Then
If TypeOf (project.Object) Is VSProject Then
Dim visualStudioProject As VSProject = DirectCast(project.Object, VSProject)
For Each reference As Reference In visualStudioProject.References
Dim referencePath As String = reference.Path
Dim exclude As Boolean = False
For Each excludePath As String In ExcludedPaths
exclude = referencePath.StartsWith(excludePath)
If exclude Then Exit For
Next
If Not exclude And Not String.IsNullOrEmpty(reference.Path) Then
If Not reference.Path.StartsWith(Path) Then
Debug.Write(project.Name)
Debug.Write(" ")
Debug.WriteLine(reference.Path)
End If
End If
Next
End If
For Each childProjectItem As ProjectItem In project.ProjectItems
If Not childProjectItem.SubProject Is Nothing Then Scan(childProjectItem.SubProject)
Next
End If
End Sub
Public Sub CheckSolutionHintPaths()
If ExcludedPaths Is Nothing Then
ExcludedPaths = New ArrayList()
ExcludedPaths.Add("C:\Windows\Microsoft.NET\Framework\")
ExcludedPaths.Add("C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\")
ExcludedPaths.Add("D:\Microsoft Visual Studio 9.0\Common7\IDE\PublicAssemblies\")
End If
Path = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(DTE.Solution.FullName), "bin")
For Each project As Project In DTE.Solution.Projects
Scan(project)
Next
End Sub
End Module
*Dont forget to replace the referenced dll after you have corrected your references