wim*_*ica 38 msbuild 64-bit x86 x86-64 program-files
在64位版本的Windows中,32位软件安装在"c:\ program files(x86)"中.这意味着你不能使用$(programfiles)来获取(32位)软件的路径.所以我需要一个$(ProgramFiles32)来克服我的MSBuild项目.我不想根据运行的操作系统更改项目.
我有一个解决方案,我会发布,但也许有一个更容易/更好的方式.
Rub*_*ink 42
在MSBuild 4.0+中,有一个$(MSBuildProgramFiles32)属性,你可以自信地直接使用它(特别是如果你准备把一个ToolsVersion="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>
Run Code Online (Sandbox Code Playgroud)
不幸的是渐进增强/填充工具的压倒一切的MSBuild保留属性名称MSBuildProgramFiles32通过无论是<PropertyGroup>或者<CreateProperty>被拒绝的MSBuild 4.0+,因此不能作出更为简洁并且还支持.NET 2.0.
wim*_*ica 16
我的解决方案是查看"c:\ program files(x86)"是否存在,如果存在,则认为这是64位操作系统.否则使用正常的程序文件目录:
<PropertyGroup>
<ProgramFiles32 Condition="Exists('$(PROGRAMFILES) (x86)')">$(PROGRAMFILES) (x86)</ProgramFiles32>
<ProgramFiles32 Condition="$(ProgramFiles32) == ''">$(PROGRAMFILES)</ProgramFiles32>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
我可以像这样使用它
<Exec WorkingDirectory="src\app1" Command='"$(ProgramFiles32)\doxygen\bin\doxygen" Doxyfile' />
Run Code Online (Sandbox Code Playgroud)