在64位版本的Windows中,32位软件安装在“c:\ program files(x86)”中。这意味着你不能使用$(programfiles)来获取(32位)软件的路径。所以我需要一个$(ProgramFiles32)来克服我的MSBuild项目。我不想根据它运行的操作系统来更改项目。
我有一个我会发布的解决方案,但也许有更简单/更好的方式。
答案 0 :(得分:41)
在MSBuild 4.0+中,它有a $(MSBuildProgramFiles32)
property,你可以自信地直接使用它(特别是如果你准备将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>
不幸的是Progressive enhancement / polyfill通过MSBuildProgramFiles32
或<PropertyGroup>
覆盖MSBuild reserved property名称<CreateProperty>
被MSBuild 4.0+拒绝它不能变得更整洁,仍然支持.NET 2.0。
答案 1 :(得分:16)
我的解决方案是查看“c:\ program files(x86)”是否存在,如果存在,则认为这是64位操作系统。否则使用正常的程序文件目录:
<PropertyGroup>
<ProgramFiles32 Condition="Exists('$(PROGRAMFILES) (x86)')">$(PROGRAMFILES) (x86)</ProgramFiles32>
<ProgramFiles32 Condition="$(ProgramFiles32) == ''">$(PROGRAMFILES)</ProgramFiles32>
</PropertyGroup>
我可以像这样使用它
<Exec WorkingDirectory="src\app1" Command='"$(ProgramFiles32)\doxygen\bin\doxygen" Doxyfile' />
答案 2 :(得分:11)
在MSBuild 4.0中,$(MSBuildProgramFiles32)
将为您提供32位Program Files目录。
答案 3 :(得分:8)
尝试"$(MSBuildExtensionsPath32)\.."
答案 4 :(得分:4)
我认为一种更可靠的方法是获取环境变量“ProgramFiles(x86)”。在Windows上的64位进程中,这将指向32位程序文件目录。在32位版本的Windows上它将是空的,我
我最近遇到了一些与PowerShell脚本相同的问题。我写了一篇关于如何解决程序文件目录问题的博客文章。显然不同的语言,但它可能会帮助你。
http://blogs.msdn.com/jaredpar/archive/2008/10/21/program-files-i-just-want-the-32-bit-version.aspx
答案 5 :(得分:1)
我偶然发现了这个问题,试图在MSbuild中找到一个通用的方法来查看它是32位还是64位操作系统。如果其他人也发现了这一点,我使用了以下内容:
<PropertyGroup>
<OSBits Condition="$(ProgramW6432) != ''">x64</OSBits>
<OSBits Condition="$(OSBits) == ''">x32</OSBits>
</PropertyGroup>
显然%ProgramW6432%
仅在64位系统上设置。
答案 6 :(得分:1)
如果你运行32位版本的Visual Studio工具(特别是在VS2012中,你可以选择3种不同的命令提示),$(ProgramFiles)指向“Program Files(x86)”