在64位版本的Windows中,32位软件被安装在"c:\program files (x86)"。这意味着您不能使用$(programfiles)来获取到(32位)软件的路径。所以我需要一个$(ProgramFiles32)在我的MSBuild项目中克服这个问题。我不想根据正在运行的操作系统改变项目。
我有一个解决方案,我会发布出来,但也许有更简单/更好的方法。
我有一个解决方案,我会发布出来,但也许有更简单/更好的方法。
$(MSBuildProgramFiles32)
属性可以直接使用(特别是如果您准备在文件顶部放置ToolsVersion="4.0"
以确保它可用,并在不可用时Fail Fast)。<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. https://dev59.com/z3RC5IYBdhLWcg3wUvQS
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>
很遗憾,通过<PropertyGroup>
或<CreateProperty>
进行渐进增强/polyfill覆盖MSBuild保留属性名称MSBuildProgramFiles32
的操作被MSBuild 4.0+拒绝,因此无法使其更加整洁并仍然支持.NET 2.0。
错误 MSB4004: "MSBuildProgramFiles32" 属性已被保留,无法修改。
- Wernight我的解决方案是查看是否存在"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' />
Framework64
版本,则可以正常工作。已确认适用于4.0.30319,包括.NET 4.5更新版。还要注意的是,尽管你的观点是正确的,但并不妨碍答案实际上是有效的,即在MSBuild 2和4 x86和x64上计算program files (x86)
(根据你提供的信息,我本来想把我的+1变成-1)。 - Ruben Bartelink$(MSBuildProgramFiles32)
将会给出32位的Program Files目录。尝试使用"$(MSBuildExtensionsPath32)\.."
C:\ Program Files \ dotnet \ sdk \ ...
- alastairtreemsbuild/diag
显示存在的环境变量)。PROCESSOR_ARCHITECTURE
(=AMD64
)是存在的最有用的值。 - Ruben Bartelink<PropertyGroup>
<OSBits Condition="$(ProgramW6432) != ''">x64</OSBits>
<OSBits Condition="$(OSBits) == ''">x32</OSBits>
</PropertyGroup>
显然,%ProgramW6432%
只在64位系统上设置。
PROCESSOR_ARCHITECTURE
变量(例如,AMD64
)以获得更严格的控制。 - Ruben Bartelink