Since upgrading to VS 2015, my team has experienced random quirky things which I'm sure are being worked out at Microsoft right now. One pretty annoying one is that we seem to lose project references, especially after branching. I began to work on a new branch of our solution yesterday only to find out that types were unrecognized and namespace usings were being cited as unnecessary (because they were for the types that had suddenly become unrecognized).
The references in the project did not show any icons indicating a problem with the reference, but just to see if it would work, I removed and re-added a project reference, which caused its types to be recognized once more.
This, of course, updated the project file, so I looked to see what changes had been made. The only difference between the project that could not detect the reference and the one that now can is that the alpha characters in the GUID had been changed from lower case to upper case. For example:
Old, broken reference:
<ProjectReference Include="path/redacted"> <Project>{95d34b2e-2ceb-499e-ab9e-b644b0af710d}</Project> <Name>Project.Name.Redacted</Name> </ProjectReference>
New, fixed reference:
<ProjectReference Include="path/redacted"> <Project>{95D34B2E-2CEB-499E-AB9E-B644B0AF710D}</Project> <Name>Project.Name.Redacted</Name> </ProjectReference>
I'm looking for the reason this is happening and how I might fix it without having to manually remove and re-add references all over the place (and without having to convert all the project file GUIDs to upper case).
I should note that these "broken" references are not breaking the build, and that they only show up in the Error List as IntelliSense error, not build errors. So, the references aren't really broken, they've just broken IntelliSense (which is arguably worse?!).
Project GUIDs Uniquely Identify Projects Visual Studio uses project GUIDs to identify different project files and their dependencies in a solution file, as well as for references between projects inside a single solution file. For this to work, it needs all project GUIDs to be unique inside a solution file.
TL;DR
Visual Studio isn't entirely consistent about how it assigns GUIDs to projects or how it specifies those GUIDs in project references. I was able to resolve the problem by using upper case GUIDs with braces for ProjectGuid
elements and lower case with braces for Project
elements (in references).
Background
We have a large solution (60+ C# projects), and were having regular issues with solution Rebuild as incorrect build order would cause failure to resolve referenced projects that had not yet been built (but should have been). Build Dependencies and Build Order appeared correct. MSBuild batch build worked fine, it was only a problem when rebuilding from Visual Studio.
Forcing all project GUIDs to upper case with braces and all project reference GUIDs to lower case with braces fixed the problem. This is usually how Visual Studio generates these GUIDs, but not always.
Doing some investigation in a brand new test solution, it turns out that:
I was able to fix our broken rebuild by replacing the reference GUIDs with either all upper case or all lower case -- it's something about the mix of upper and lower case that was giving Visual Studio problems (perhaps case-sensitive string keys in a dictionary somewhere?) Since Visual Studio normally adds references with lower case GUIDs, that is the option I chose to go with.
Regex Search & Replace
To fix this, I used Notepad++ regex-based search and replace in files to force all ProjectGuids in .csproj files to be upper case with braces (the default for console applications, and the style Visual Studio will apply after adding any project reference to the project):
Find what: (<ProjectGuid>)\{?([0-9a-f-]+)\}?(</ProjectGuid>) Replace with: \1{\U\2}\E\3 Search in: *.csproj
Be sure to turn on regular expression search, and turn off match case. And don't search all files, or you may make changes you don't want, for example in *.xproj files, as noted by @AspNyc. (See this answer for additional info on use of regular expressions for changing case.)
I then replaced all references to projects to use lower case with braces (which is what Visual Studio usually does):
Find what: (<Project>)\{?([0-9a-f-]+)\}?(</Project>) Replace with: \1{\L\2}\E\3 Search in: *.csproj
Having made these changes, Visual Studio solution rebuild now works reliably. (At least until next time rogue upper case reference GUIDs sneak into our project.)
I suffered a similar issue when updating VS2017 v15.7 to v15.9.
The answer for me was to close down VS, clear out the hidden .vs
folder in my solution's root directory and restart VS.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With