如何在运行时确定我的 WiX ManagedBootstrapperApplication 中包含的产品的 ProductCode?

Posted

技术标签:

【中文标题】如何在运行时确定我的 WiX ManagedBootstrapperApplication 中包含的产品的 ProductCode?【英文标题】:How can I determine the ProductCode for the included products in my WiX ManagedBootstrapperApplication at runtime? 【发布时间】:2013-12-10 22:01:06 【问题描述】:

我有一个托管引导程序应用程序,其中包含四个产品。每个产品都使用 "*" 作为 Id 进行定义,并具有唯一的 UpgradeCode。

在我的托管引导程序中,我需要为我的捆绑包中的产品获取 ProductCode (GUID)。检测事件处理程序的事件参数(例如DetectPackageCompleteEventArgs)有一个PackageId 值,它是msi 的名称(例如:“Common.msi”包有一个“Common.msi”的PackageId)。

我还检查了 BootstrapperApplicationData.xml 文件,其中包含捆绑包本身的 ProductCodeUpgradeCode,但在单个产品的 WixPackageProperties 节点中没有。

在检测到(升级)相关包的情况下,ProductCode 包含在DetectRelatedMsiPackageEventArgs 中,但在运行当前安装版本的安装程序时不会触发该事件(即:单击“修改”添加/删除程序)

如何在我的 MBA 课程中确定运行时包含的产品的 ProductCode 是什么?

附加信息:

最终,我使用产品代码使用MsiGetProductInfo(productCode, "InstallLocation", strbuffer, len); 获取ARPINSTALLLOCATION 值这专门用于用户“修改”现有安装的情况(即:运行与已安装版本相同的安装程序版本)安装包——不是升级),我需要确定它们最初安装到的文件夹。

【问题讨论】:

【参考方案1】:

简短回答:产品代码未提供给 BA。但是显式注册表项(例如,在"remember property pattern" that Rob discusses 之后)将比 ARPINSTALLLOCATION/MsiGetProductInfo 更可靠且更易于实现。

更长的答案:Burn 在所有“模式”中都以相同的方式运行检测,但当软件包中的软件包版本与机器上安装的版本相同时,明确不会发送软件包级别的检测消息。

此类静态数据位于 BA 清单中,但在 v3.8 中不包含产品代码。请file a feature request。

【讨论】:

功能请求已实现,当前位置为github.com/wixtoolset/issues/issues/4233

以上是关于如何在运行时确定我的 WiX ManagedBootstrapperApplication 中包含的产品的 ProductCode?的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 wix msi 以运行管理员广告

Wix 自定义卸载操作 - 如何在 msi 删除文件之前运行

如何确定哪些正在运行的应用程序正在使用 .Net

即使使用 --no-build 标志运行 dotnet test 时如何避免 Wix 构建错误?

带有 WIX 的 C++ 可再发行包

如何关闭正在运行的 wix 安装程序?