В MSBuild 4.0+ для него есть свойство $(MSBuildProgramFiles32)
, которое вы можете с уверенностью использовать напрямую (особенно если вы готовы поставить ToolsVersion="4.0"
в верхней части файла, чтобы гарантировать он будет доступен и Fail Fast , если его нет).
Если вам это не нужно и вам нужно что-то, что может делать правильные вещи, даже когда выполняется в среде MSBuild 2.0 или более поздней версии (т. Е. Обратно в среды VS 2005), полное решение:
<PropertyGroup>
<!--MSBuild 4.0 property-->
<ProgramFiles32>$(MSBuildProgramFiles32)</ProgramFiles32>
<!--Use OS env var as a fallback:- 32 bit MSBuild 2.0/3.5 on x64 will use this-->
<ProgramFiles32 Condition=" '' == '$(ProgramFiles32)'">$(ProgramFiles%28x86%29)</ProgramFiles32>
<!-- Handle MSBuild 2.0/3.5 running in 64 bit mode - neither of the above env vars are available. http://stackoverflow.com/questions/336633
NB this trick (Adding a literal " (x86)" to the 64 bit Program Files path) may or may not work on all versions/locales of Windows -->
<ProgramFiles32 Condition ="'$(ProgramFiles32)'=='' AND 'AMD64' == '$(PROCESSOR_ARCHITECTURE)'">$(ProgramFiles) (x86)</ProgramFiles32>
<!--Catch-all - handles .NET 2.0/3.5 non-AMD64 and .NET 2.0 on x86 -->
<ProgramFiles32 Condition=" '' == '$(ProgramFiles32)' ">$(ProgramFiles)</ProgramFiles32>
</PropertyGroup>
К сожалению Прогрессивное улучшение / polyfill переопределение зарезервированного свойства MSBuild name MSBuildProgramFiles32
через <PropertyGroup>
или <CreateProperty>
отклонено MSBuild 4.0+, поэтому его нельзя сделать более аккуратным и поддерживать .NET 2.0.