水平线下方是我最初的回应,我认为这是错误的。
您可以像 roli09 那样定义版本变量,即:
<Variable Name="Hasp_BundleVersion" Type="version" Value="7.54.8889.1" />
而且你不需要“v”。如果您执行如下条件,则确实需要 v:
Condition="InstalledVersion >= v7.0.2.1"
以便编译器将第二个操作数作为版本进行处理。
我认为这里发生的事情是在第一个代码片段中,我们将两个版本都视为字符串变量。作为字符串,它们会逐个字符进行比较,并且 '6'
在第二个代码片段中,我相信我们最终得到两个 Hasp_InstalledVersion 变量。捆绑包中定义的变量是“版本”变量,而 RegistySearch 定义的变量是字符串变量。我猜测在这种情况下它会比较两个版本变量,所以这
Hasp_InstalledVersion >= Hasp_BundleVersion
becomes
0.0.0.0 >= 7.54.8889.1
这是错误的。
要解决此问题,请定义
<Variable Name="Hasp_BundleVersion" Type="version" Value="7.54.8889.1" />
但不定义
<Variable Name="Hasp_InstalledVersion" Type="version" Value="0.0.0.0" />
现在它应该将注册表搜索中的字符串变量与 proj 文件中定义的版本变量进行比较。在burn的condition.cpp中,如果有一个“字符串变量OPERATION版本变量”,它会尝试将字符串变量转换为版本变量并进行版本比较。
Wix 烧伤状况评估有点令人困惑。
我不久前进行了深入研究,以找出这个确切的问题。我认为问题在于您错误地定义了版本值。
另外,我不确定你是否可以使用
<Variable Name="Hasp_InstalledVersion" Type="version" Value="0.0.0.0" />
因为RegistrySearches 设置的所有变量都是字符串变量。我不确定您现在是否最终定义了两个 Hasp_InstalledVersion 变量,因为一个是“版本”变量,另一个是“字符串”版本。不想深入研究 wix 源代码,我只想坚持将其保留为非类型变量,就像您的第一个代码片段中一样。
现在,在修复您的条件时,在条件评估中,根据所述变量的格式,将字符串变量提升为其他类型的变量。即: string op string 会进行字符串比较,string op version 会进行版本比较。
格式化变量以指示它是版本的方法是在其前面添加“v”。因此,我相信如果您将 Hasp_BundleVersion 更新为
<Variable Name="Hasp_BundleVersion" Value="v7.54.8889.1" />
或者更好的是,您可以在包含文件或属性文件中的某个位置定义版本(对于 msbuild,然后包含在 DefineConstants 中),并且可以将代码更新为
<Variable Name="Hasp_BundleVersion" Value="v$(var.HaspBundleVersion)" />
但我认为走到这一步只是一个偏好问题。