在 64 位版本的 windows 中,32 位软件安装在“c:\program files (x86)”中。这意味着您不能使用 $(programfiles) 来获取(32 位)软件的路径。所以我需要一个 $(ProgramFiles32) 在我的 MSBuild 项目中克服这个问题。我不想根据正在运行的操作系统更改项目。
我有一个我会发布的解决方案,但也许有一个更简单/更好的方法。
在 64 位版本的 windows 中,32 位软件安装在“c:\program files (x86)”中。这意味着您不能使用 $(programfiles) 来获取(32 位)软件的路径。所以我需要一个 $(ProgramFiles32) 在我的 MSBuild 项目中克服这个问题。我不想根据正在运行的操作系统更改项目。
我有一个我会发布的解决方案,但也许有一个更简单/更好的方法。
在 MSBuild 4.0+ 中,它有一个$(MSBuildProgramFiles32)
属性,您可以放心地直接使用它(特别是如果您准备将 aToolsVersion="4.0"
放在文件顶部以保证它可用,如果不可用,则快速失败)。
如果您不需要并且需要即使在 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>
不幸的是, MSBuild 保留属性名称的渐进增强/ polyfill覆盖通过 a或被MSBuild 4.0+ 拒绝,因此它不能变得更整洁并且仍然支持 .NET 2.0。MSBuildProgramFiles32
<PropertyGroup>
<CreateProperty>
我的解决方案是查看“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' />
在 MSBuild 4.0 中,$(MSBuildProgramFiles32)
将为您提供 32 位的 Program Files 目录。
尝试"$(MSBuildExtensionsPath32)\.."
我认为更可靠的方法是获取环境变量“ProgramFiles(x86)”。在 Windows 上的 64 位进程中,这将指向 32 位程序文件目录。在 32 位版本的 Windows 上它将是空的,我相信在 wow64 进程上
我最近在使用一些 PowerShell 脚本时遇到了几乎相同的问题。我写了一篇关于如何解决程序文件目录问题的博客文章。显然不同的语言,但它可能会帮助你。
http://blogs.msdn.com/jaredpar/archive/2008/10/21/program-files-i-just-want-the-32-bit-version.aspx
我偶然发现了这个问题,试图在 MSbuild 中找到一种通用方法来查看它是 32 位还是 64 位操作系统。如果其他人也发现了这个,我使用了以下内容:
<PropertyGroup>
<OSBits Condition="$(ProgramW6432) != ''">x64</OSBits>
<OSBits Condition="$(OSBits) == ''">x32</OSBits>
</PropertyGroup>
显然%ProgramW6432%
只在 64 位系统上设置。
如果您运行 32 位版本的 Visual Studio 工具(尤其是在 VS2012 中,您可以选择 3 种不同的命令提示符),$(ProgramFiles) 指向“Program Files (x86)”