如何在运行时确定我的 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 文件,其中包含捆绑包本身的 ProductCode
和 UpgradeCode
,但在单个产品的 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 删除文件之前运行