【问题标题】:WiX: Obtaining version for already installed 3rd party programWiX:获取已安装的第 3 方程序的版本
【发布时间】:2018-03-21 13:00:09
【问题描述】:

我正在尝试将安装程序配置为仅在安装某些版本的第 3 方应用程序时有条件地安装某些组件。


需要注意的是,第 3 方软件版本与我们的版本之间存在 1:1 对应关系。第 3 方软件的此类版本是否有几十个(加上每个月最多三个额外版本),所以我们不想正在执行手动编辑。我们的程序是针对第 3 方软件的所有版本自动构建的,但安装哪些文件需要有条件地进行。

我只是将其部署为单个 .MSI,因此没有 Bootstrapper 等。 根据我的阅读和谷歌搜索,我相信我需要有一个 UPGRADE 部分,以确定应用程序当前将具有什么 PRODUCTCODE(多个版本..因此可能有多个 PRODUCTCODE)。 然后可以使用此 PRODUCTCODE 从注册表中读取 DisplayVersion。

所以我有:

<Upgrade Id="{6D991503-3102-437E-B21D-471599D491AB}">
    <UpgradeVersion Minimum="0.0.0.0" OnlyDetect="yes" Property="CLEARSCADADETECTED" />
</Upgrade>

升级部分,然后..

<Property Id="CLEARSCADA_VER" Secure="yes" Hidden="no" Value="6.78.6626.1">
    <RegistrySearch Id="ClearSCADAVersionSearch"
                    Root="HKLM"
                    Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\[CLEARSCADADETECTED]"
                    Name="DisplayVersion"
                    Type="raw"
                    Win64="yes" />
</Property>

对于 REGISTRYSEARCH。

看起来 PRODUCTCODE 查找正在运行,但是 Registrysearch 没有。(我希望 AppSearch 之后有一个 PROPERTY CHANGE 条目)

FindRelatedProducts: Found application: {2ACE38B2-F142-4EFE-9AC7-B25514E4930E}
MSI (c) (F0:90) [23:17:39:598]: PROPERTY CHANGE: Adding CLEARSCADADETECTED property. Its value is '{2ACE38B2-F142-4EFE-9AC7-B25514E4930E}'.
Action ended 23:17:39: FindRelatedProducts. Return value 1.
...
AppSearch: Property: CLEARSCADA_VER, Signature: ClearSCADAVersionSearch
MSI (c) (F0:90) [23:17:39:629]: Note: 1: 2262 2: Signature 3: -2147287038 
Action ended 23:17:39: AppSearch. Return value 1.

我已尝试对注册表查找进行硬编码(即将 [CLEARSCADADETECTED] 替换为 {2ACE38B2-F142-4EFE-9AC7-B25514E4930E} 的静态文本),没有任何更改。 对于检查内容的任何其他建议将不胜感激。


好的,令人困惑的是,如果我引用 Version DWORD 值(而不是 DisplayVersion 字符串值),那么它确实将其正确读取为 #105781730。 RegistrySearch 是否可能不适用于字符串值?


耶...它的工作。而且我想它现在也已经工作了一段时间。 当我输入 Value='6.78.6626.1' 时,我应该意识到,如果我测试它的版本已经是 '6.78.6626.1',那么它就不会表明属性更改。

贝文

【问题讨论】:

  • 设置Hidden 属性可能会在日志文件中隐藏设置属性操作。请看下面我的回答。将测试它是否适用于指定的Value 属性(我也取出了那个)。

标签: wix windows-installer registry version wix3.11


【解决方案1】:

我没有测试实际的主要升级检测,但可能会尝试删除Hidden 属性,这似乎会从日志中删除设置属性操作。我最初也删除了Value 属性,但把它放回去现在设置为0:

<Property Id="CLEARSCADA_VER" Secure="yes" Value="0">
 <RegistrySearch Id="ClearSCADAVersionSearch"
                 Root="HKLM"
                 Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\[CLEARSCADADETECTED]"
                 Name="DisplayVersion"
                 Type="raw"
                 Win64="yes" />
</Property>

我进行了快速测试,这对我有用。并且您正在使用 WiX 文件中的设置正确搜索注册表的 64 位部分(假设这确实是您要搜索的部分)。自从 PhilDW 回答后,您可能已经更新了您的问题?


我还验证了注册表搜索不区分大小写。我不记得是不是。

要检查搜索和属性值,您可以使用脚本自定义操作进行调试(这样就没有编译和麻烦)。

  • VBScript 可以很好地进行调试,但不应用于生产代码。
  • 我可以为 VBScript 自定义操作转储所需的 WiX 自定义操作元素,为您显示属性值,但如果您不想要它,我不想让这个答案比现在更冗长。

您确定一次只安装一个版本的第 3 方应用程序吗?也许与供应商核对并保证他们将如何进行部署可以在以后为您避免突然出现的问题? 对其他包行为的依赖可能是一颗定时炸弹——它是非常紧密的耦合,超出了你的控制。不要听起来太戏剧化,这可能很好。只是提一下。如果你问我,检查这是一项经理任务。

这有点你在做什么,但遗憾的是,我经常遇到逻辑随着时间的推移变得更加复杂,我最终不得不求助于自定义操作来处理各种边缘情况.希望您不必走那条路,因为您正在做正确的事情trying to avoid custom actions

【讨论】:

  • 谢谢@SteinAsmul :)
    是的,紧耦合是不想要的,但我们已经检查过了,实际上并没有避免它。第 3 方应用程序加载了我们的 DLL,而后者又加载了我们的 EXE,并且似乎第 3 部分应用程序进行了显式的依赖版本检查,所以我无法想象我们可以在安装后解决它的非超级 hacky 方式.
    我会整理您建议的自定义操作方法进行测试...感谢您的建议:)
  • 不确定我是否推荐了自定义操作。我基本上说过,对于这种复杂的需求,您最终往往会使用自定义操作来处理边缘情况。真正的解决方案——如果可能的话——将以某种方式降低复杂性,使部署更加可靠。通常是一项涉及部署专业知识和管理流程的任务(将不同的团队放在同一页面上)。也许来自第三方的合并模块将是可行的方法,这样您就可以交付一个包来完成所有工作?
  • 不幸的是,来自第三方的合并模块也不起作用。无论安装了哪个版本的软件,我们仍然需要安装特定版本的驱动程序。我确实尝试了更多的东西,比如引用不同的注册表值(但相同的注册表项)..这很有效,所以更令人困惑。也许字符串数据类型是个问题?
【解决方案2】:

不清楚您是否需要注册表搜索,因为您可以拥有多个 UpgradeVersion 元素,每个元素都有您想要的版本。因此,在搜索中无需担心多个 ProductCode 值。该文档在这里:

https://www.firegiant.com/wix/tutorial/upgrades-and-modularization/checking-for-oldies/

显示了多个 UpgradeVersion 元素的示例。

话虽如此,最简单的方法是拥有一个 UpgradeVersion 来引用您关心的确切版本范围,如果找到该范围内的任何内容,这将设置您的属性。您只需将最小值和最大值设置为值。

您的注册表搜索屏幕截图似乎显示了可能是 64 位系统上的本机注册表。您的搜索未明确设置 Win64,可能正在搜索 32 位注册表。

【讨论】:

  • 正如在编辑中阐明的那样,我们构建的软件与已发布的第 3 方软件版本是 1:1 版本匹配。因此,我们的软件是专门针对第三方软件的一个版本(自动)构建的。让 UPGRADE 引用除单个软件版本以外的任何内容都是不可行的。
    一个月最多可以发布 3 个版本,因此手动编辑这种情况也不适合。它确实需要根据精确的版本号在安装时应用条件,其中可能有几十个..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多