【问题标题】:MSBuild and $(ProgramFiles) issue with 32/64 bits32/64 位的 MSBuild 和 $(ProgramFiles) 问题
【发布时间】:2011-10-27 08:54:09
【问题描述】:

我编写了一个自定义 MSBuild 任务,它调用 SubWCRev.exe,一个(通常)驻留在 C:\Program Files\TortoiseSVN\bin 中的可执行文件,无论是 32 位还是 64 位,因为 TortoiseSVN 提供了这两个版本。

问题是,Visual Studio 2010 只有 32 位版本。因此,当我使用 64 位机器的同事尝试使用我闪亮的新任务进行构建时,$(ProgramFiles) 解析为 C:\Program Files(x86),它会爆炸说找不到 SubWCRev.exe。因为他们有 64 位版本的 TortoiseSVN,它位于 C:\Program Files!

有没有比在我的 msbuild 脚本中硬编码 C:\Program Files 或让每个人都使用 32 位版本的 TortoiseSVN 更好的解决方案? (其实是一个C#项目,我稍微修改了一下MSBuild代码)

【问题讨论】:

    标签: visual-studio-2010 msbuild 32bit-64bit


    【解决方案1】:

    看看这个:

    <Project ToolsVersion="4.0" DefaultTargets="PrintValues" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    
      <Target Name="PrintValues">
        <PropertyGroup>
          <MyProgramFiles>$(ProgramW6432)</MyProgramFiles>
          <MyProgramFiles Condition="$(MyProgramFiles) == ''">$(ProgramFiles)</MyProgramFiles>
        </PropertyGroup>
    
        <Message Text="MyProgramFiles: $(MyProgramFiles)"/>
      </Target>
    
    </Project>
    

    这让MyProgramFiles 在 32 位和 64 位 Windows 上解析为“C:\Program Files”(在非 64 位版本的 Windows 上,ProgramW6432 环境变量为空)。

    【讨论】:

      【解决方案2】:

      使用MSBuildExtensionsPath 属性而不是硬编码路径。

      MSDN:

      \Program Files\ 或 \Program Files 下的 MSBuild 子文件夹 (x86) 文件夹。此路径始终指向相同的 Program Files 位数作为您当前正在运行的窗口。例如,对于 64 位机器上的 32 位窗口,路径是 Program Files (x86) 文件夹。对于 64 位机器上的 64 位窗口,路径是 程序文件文件夹。另请参阅 MSBuildExtensionsPath32 和 MSBuildExtensionsPath64。

      编辑:要进入 64 位 SVN 文件夹,请使用:

      <PropertyGroup>
         <TortoiseSVNPath>$(MSBuildExtensionsPath64)\..\TortoiseSVN\bin</TortoiseSVNPath>
      </PropertyGroup>
      

      另一种方法是检查文件夹是否存在:

      <PropertyGroup>
        <TortoiseSVNPath Condition="Exists('$(PROGRAMFILES) (x86)')">$(PROGRAMFILES) (x86)\TortoiseSVN\bin</TortoiseSVNPath>
        <TortoiseSVNPath Condition="$(TortoiseSVNPath) == ''">$(PROGRAMFILES)\TortoiseSVN\bin</TortoiseSVNPath>
      </PropertyGroup>
      

      【讨论】:

      • 对不起,我刚试了一下,它解析为 C:\Program Files (x86)\MSBuild。我很肯定它是一个 Windows 7 64 位机器,而 Visual Studio 是一个 32 位进程(刚刚使用 Process Explorer 检查过)。
      • 这是正确的行为。对于 32 位 VS,它应该解析为 C:\Program Files (x86)...。最后的 MSBuild 对您来说是个问题吗? $(MSBuildExtensionsPath)\.. 将提供正确的 Program Files 文件夹。
      • 是的,这是个问题,因为即使我运行的是 32 位的 Visual Studio,我也想调用 64 位的 SubWCRev.exe
      • 然后只需使用$(MSBuildExtensionsPath64)..\TortoiseSVN\binMSBuildExtensionsPath64 将始终指向 64 位 Program Files\MSBuild 文件夹
      • 但是当我在 32 位 Windows 上运行该变量时,它不会为空吗?忘记澄清了,我们也有 Windows XP 32 位机器和 Windows 7 64 位机器。我们的产品仍处于过渡阶段
      猜你喜欢
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 2019-06-13
      • 1970-01-01
      • 2021-05-23
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多