Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How or why is MSBuild choosing the x64 platform when I don't specify it instead of AnyCPU?

Tags:

64-bit

msbuild

I'm running msbuild.exe via Rake from a regular PowerShell console. This is the command as printed from a diagnostic level run

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" "D:/Projects/machine.specifications/Source/Machine.Specifications/Machine.Specifications.csproj31881140" /maxcpucount /target:Build /verbosity:diagnostic /property:Configuration=Debug /property:TrackFileAccess=false /property:BuildInParallel=false /property:BuildRunner=Rake

And the build is failing because msbuild is picking x64 as the Platform.

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(483,9): error : The OutputPath property is not set for project 'Machine.Specifications.csproj37103470'. Please check to make sure that you have specified a valid combination of Configuration and Platform for this project. Configuration='Debug' Platform='X64'. You may be seeing this message because you are trying to build a project without a solution file, and have specified a non-default Configuration or Platform that doesn't exist for this project.

I'm not passing it in on the command line (or from the script). The csproj has a default configuration

<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>

and two specific configurations

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">

So, I expected the AnyCPU platform to be selected. But, for some reason, something is picking or sending in x64. I don't think the Rake system is a problem here, I've seen this behavior before on raw cmd line calls to msbuild (but I haven't documented them).

I'm on 64-bit Windows 7, calling msbuild 4.0. I don't know if that's relevant.


I am loading the 64-bit Visual Studio tools (C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64) using Invoke-BatchFile in my PowerShell profile. Could that be the culprit?

Why would msbuild deliberately choose x64 anyway? The 32-bit version doesn't choose x86 for you.


*1: The PowerShell console is at %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe *2: I'm running the MSpec build (here's the rakefile and the msbuild call)

like image 225
Anthony Mastrean Avatar asked Jan 09 '12 19:01

Anthony Mastrean


People also ask

Which is better 64-bit or 32-bit MSBuild?

Here's why it matters. Simply put, a 64-bit processor is more capable than a 32-bit processor because it can handle more data at once. A 64-bit processor can store more computational values, including memory addresses, which means it can access over 4 billion times the physical memory of a 32-bit processor.

How do I change from platform target to x64?

To enable x64 as a CPU platform targetClick Configuration Manager. In the Configuration Manager dialog, open the Active solution platform drop-down list box and click <New> …. In the New Solution Platform dialog, select x64 in the Type or select the new platform drop-down list box.

What does Anycpu mean?

The default setting, "Any CPU", means that the assembly will run natively on the CPU it is currently running on. Meaning, it will run as 64-bit on a 64-bit machine and 32-bit on a 32-bit machine. If the assembly is called from a 64-bit application, it will perform as a 64-bit assembly and so on.

Where is MSBuild path set?

MSBuild is installed directly under %ProgramFiles%. So, the path for MSBuild might be different depending on the version of Visual Studio. Path is C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\MsBuild.exe .


1 Answers

When you launch Visual Studio x64 command window, it sets an environment variable :

Platform=X64

This is a difference from the 32 bit command window, where this environment variable is not defined, and MSBuild then uses the conditional logic to use default platform.

You can either remove the Platform environment variable in your batch file, or pass in explicit Platform property as a parameter to MSBuild.

like image 63
seva titov Avatar answered Oct 15 '22 08:10

seva titov