Prebuild event in Visual Studio replacing $(SolutionDir) with *Undefined*

Visual Studio-2008Prebuild

Visual Studio-2008 Problem Overview


I believe the problem is documented here moved here and looks like it might be a bug in visual studio, but I'm wondering if anyone knows of a workaround.

Basically I have the following two lines (among other things) one right after the other in the prebuild event.

"C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" /p:configuration=Release;platform=x86 /t:rebuild "$(SolutionDir)Folder1\Project1.csproj"

"C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" /p:configuration=Release;platform=x86 /t:rebuild "$(SolutionDir)Folder2\Folder3\Project2.csproj" 

The first one succeeds and the other fails saying that The command ""C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" /p:configuration=Release;platform=x86 /t:rebuild "*Undefined*Folder2\Folder3\Project2.csproj"" exited with code 1..

Edit:
Figured out the problem was that one of the other projects with the same line as it's prebuild failed, since MSBuild itself doesn't know about the macros.

Visual Studio-2008 Solutions


Solution 1 - Visual Studio-2008

I fixed this by replacing all $(SolutionDir) with $(ProjectDir)..\.

It was due to MSBuild running each project independently, and thus not the solution. It worked fine in VS2010, but not on the build server.

Solution 2 - Visual Studio-2008

Wasted a lot of time to find perfect solution for this problem. Use Directory.Build.props.

In your sln location folder create a file with name Directory.Build.props and put this code inside:

<Project>
 <PropertyGroup>
	<SolutionDir>$(MSBuildThisFileDirectory)</SolutionDir>
 </PropertyGroup>
</Project>

This file will be automagically picked up by all your csproj files and will define (SolutionDir) property.

Solution 3 - Visual Studio-2008

Allan's answer is exactly on the right path, but if you want to move to parent directory of the ProjectDir, or the $(ProjectDir)..\ output is going to be a string, you need to perform the 'go to parent directory' operation in msbuild.
Here is how you can achieve this:

<PropertyGroup>
  <TrimmedDir>$([System.IO.Path]::GetDirectoryName($(ProjectDir)))</TrimmedDir>
</PropertyGroup>

This code will set the parent directory path of the ProjectDir to TrimmedDir variable. [System.IO.Path]::GetDirectoryName() performs this operation.

Solution 4 - Visual Studio-2008

Allan's answer had the right idea, but replacing all $(SolutionDir) with $(ProjectDir)..\ did not work for me in VS 2019 16.7.2.

$(ProjectDir)..\ evaluated to the actual ProjectDir with "..\" appended to it, instead of going up one directory.

Instead, I replaced all $(SolutionDir) with $(ProjectDir)\.. and this properly went up one directory.

Solution 5 - Visual Studio-2008

You don't specify if this happens for many projects or just one or two.

If it is only in one or two projects, a temporary workaround might be to replace $(SolutionDir) with the explicit path that Folder2 is located in. For example, something like:

"C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" /p:configuration=Release;platform=x86 /t:rebuild "C:\AllSolutions\ExampleSolutions\Folder2\Folder3\Project2.csproj"

but with the correct path for your project.

Solution 6 - Visual Studio-2008

If you are using only MSBuild and SolutionDir works for some projects but for others not, it's possible that SolutionDir is already defined somewhere in .csproj file of the working projects.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDavy8View Question on Stackoverflow
Solution 1 - Visual Studio-2008Allan Kimmer JensenView Answer on Stackoverflow
Solution 2 - Visual Studio-2008ArturView Answer on Stackoverflow
Solution 3 - Visual Studio-2008Ganesh JadhavView Answer on Stackoverflow
Solution 4 - Visual Studio-2008datchungView Answer on Stackoverflow
Solution 5 - Visual Studio-2008JeffHView Answer on Stackoverflow
Solution 6 - Visual Studio-2008HanevView Answer on Stackoverflow