【问题标题】:Launch condition to ensure that 64-bit installer is used on 64-bit system确保在 64 位系统上使用 64 位安装程序的启动条件
【发布时间】:2011-10-25 09:17:33
【问题描述】:

我的启动条件怎么了?应该是阻止 x86 安装程序在 64 位系统上运行,但似乎没有效果。

<!-- Launch Condition to check that x64 installer is used on x64 systems -->
<Condition Message="64-bit operating system was detected, please use the 64-bit installer.">
  <![CDATA[VersionNT64 AND ($(var.Win64) = "no")]]>
</Condition>

var.Win64 派生自 MSBuild 变量,如下所示:

  <!-- Define platform-specific names and locations -->
  <?if $(var.Platform) = x64 ?>
  <?define ProductName = "$(var.InstallName) (x64)" ?>
  <?define Win64 = "yes" ?>
  <?define PlatformProgramFilesFolder = "ProgramFiles64Folder" ?>
  <?define PlatformCommonFilesFolder = "CommonFiles64Folder" ?>
  <?else ?>
  <?define ProductName = "$(var.InstallName) (x86)" ?>
  <?define Win64 = "no" ?>
  <?define PlatformProgramFilesFolder = "ProgramFilesFolder" ?>
  <?define PlatformCommonFilesFolder = "CommonFilesFolder" ?>
  <?endif ?>

我想解决我的问题,但我也有兴趣了解解决此类问题的策略。

【问题讨论】:

    标签: wix wix3.5 launch-condition


    【解决方案1】:

    根据LaunchCondition table的定义:

    必须计算为 True 才能开始安装的表达式。

    您的条件由两部分组成:第一个在安装时评估,另一个在构建时评估。因此,对于 x86 包,条件的第二部分将在构建时评估为“no”=“no”,这显然在安装时给出了 True。第一部分 - VersionNT64 - 在 x64 机器上定义(因此为 True)。这就是为什么整个条件为 True 并开始安装的原因。

    你可以改写你的条件如下:

    <Condition Message="64-bit operating system was detected, please use the 64-bit installer.">
      <?if $(var.Win64) = "yes" ?>
        VersionNT64
      <?else?>
        NOT VersionNT64
      <?endif?>
    </Condition>
    

    因此,在 64 位包中,条件将只是 VersionNT64,并且将通过并开始安装。形成 x86 封装条件为NOT VersionNT64,在 64 位上显然会失败,但在 32 位上启动。

    【讨论】:

    • 请注意,64 位软件包在 32 位系统上中止之前不会进入 LaunchConditions。因此,实际上没有必要为这种情况更好地传达信息。
    • @Yan,谢谢你的回复。让我绝对确定我正确地理解了你,我认为你的意思是我只是在我的情况下犯了一个简单的逻辑错误。现在我看它,我想我看到了我的错误。除了您的重写版本,我认为将“否”更改为“是”也可以解决问题是否正确?所以,我会留下:VersionNT64 AND ($(var.Win64) = "yes")
    • @Tim,我不确定你的意思是否正确。看,在第二部分中添加表达式与添加安装时常量 True 或 False 相同,因为它在构建时进行评估。对于 x86 包,您最终会得到VersionNT64 AND "no" = "yes",即VersionNT64 And False,它会为您提供False,而不管VersionNT64 的值。因此,您永远不会通过此启动条件。不要将构建时间变量作为安装时间表达式的一部分 - 相反,让它影响条件,例如使用 if/else 预处理器语句。
    • 对!知道了。我正在使用你建议的重写,它对我很有效。感谢您花时间回答我的问题,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 2011-04-27
    • 2012-06-23
    • 1970-01-01
    • 2011-11-20
    相关资源
    最近更新 更多