WIX:定义不在我的.wxs文件中工作

时间:2018-05-21 19:07:17

标签: wix windows-installer

我正在尝试根据操作系统

定义myUpgrade代码
<?if VersionNT=601?>
   <?define MyUpgradeCode="{GUIDFOR_WIN7}"?>
<?elseif VersionNT&gt;=602?>
 <?define MyUpgradeCode="{GUIDFOR_WIN8AND_LATER}"?>
<?endif?>
....
....
....
<Product Name="My Product"
            Id="*"
            UpgradeCode="$(var.MyUpgradeCode)"
            Version=""
            Language="1033"
            >

但未能评估。

 error CNDL0150: Undefined preprocessor variable '$(var.MyUpgradeCode)'. [C:\
Users\abc\Installer.wixproj]

如何根据要安装的Windows操作系统版本配置2 upgradeCodes

2 个答案:

答案 0 :(得分:1)

如果它是64位计算机,那么您需要使用VERSIONNT64而不是VERSIONNT属性。

请问您为什么要更改基于操作系统的升级代码?如果您只是想避免维护2个不同版本的WXS文件,那么为什么不进行条件安装呢?如果Win7和Win8有特定的组件/功能,为什么不使用Condition Element将组件/功能标记为条件?

或者您可以根据提到的HERE

操作系统阻止整个安装

<强> 更新

    <?define MyUpgradeCode ?>

 <?if VersionNT=601?>
      <?define MyUpgradeCode="{BF23D7DA-FE7D-446A-8950-3B92DD40FED3}"?>
  <?elseif VersionNT&gt;=602?>
      <?define MyUpgradeCode="{3CA8F7F3-312B-4778-97CE-EE9B2C5453E6}"?>
  <?endif?>

用上面的代码替换你的WXS,它会起作用。您首先定义变量,然后在IF / ElseIF代码中设置它的值。

现在要指出的一件重要事情是,在构建时评估WIX中的IF / Else和所有其他条件语句。因此,它将根据正在编译的机器/服务器的操作系统版本设置升级属性,而不是在其部署的位置。

  

条件语句的目的是允许您在构建时包含或排除一段xml。如果表达式的计算结果为true,则将包含该表达式。如果它的计算结果为false,则会被忽略。

在这里阅读更多相关信息。 WIX PRE PROCESSOR

答案 1 :(得分:0)

看起来您正在项目节点之外定义变量。当我使用WiX Setup-Editor时,我遇到了同样的错误,它可以像你的样本一样创建各种各样的变量。将定义移动到项目内部节点,然后上面的答案是正确的。