在msbuild中使用32位“Program Files”目录

时间:2008-12-06 10:38:15

标签: msbuild x86 64-bit x86-64 program-files

在64位版本的Windows中,32位软件安装在“c:\ program files(x86)”中。这意味着你不能使用$(programfiles)来获取(32位)软件的路径。所以我需要一个$(ProgramFiles32)来克服我的MSBuild项目。我不想根据它运行的操作系统来更改项目。

我有一个我会发布的解决方案,但也许有更简单/更好的方式。

7 个答案:

答案 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上它将是空的,我相信在wow64进程上

我最近遇到了一些与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)”