我有一个托管引导程序应用程序,其中包含四个产品。每个产品都使用"*"
为Id定义,并具有唯一的UpgradeCode。
在我的托管引导程序中,我需要获取属于我的捆绑包的产品的ProductCode(GUID)。检测事件处理程序的事件参数(例如DetectPackageCompleteEventArgs
)具有PackageId
值,该值是msi的名称(例如:“Common.msi”包具有PackageId
的“ Common.msi“)。
我还检查了BootstrapperApplicationData.xml文件,该文件包含自身的ProductCode
和UpgradeCode
,但不在单个产品的WixPackageProperties
节点中。
如果检测到相关软件包(升级),则ProductCode
中包含DetectRelatedMsiPackageEventArgs
,但在运行当前安装版本的安装程序时,该事件不会触发(即:单击“添加/删除程序”中的“修改”)
如何在运行时在我的MBA中确定所包含产品的ProductCode是什么?
其他信息:
最终,我使用产品代码使用ARPINSTALLLOCATION
获取MsiGetProductInfo(productCode, "InstallLocation", strbuffer, len);
值。这特别适用于用户“修改”现有安装的情况(即:运行相同的安装程序)版本作为已安装的软件包 - 而不是升级),我需要确定它们最初安装的文件夹。
答案 0 :(得分:2)
简答:产品代码未提供给BA。但是显式的注册表项(例如,在"remember property pattern" that Rob discusses之后)将比ARPINSTALLLOCATION / MsiGetProductInfo更可靠,更容易实现。
更长的答案:Burn在所有“模式”中以相同的方式运行检测,但是当包中的软件包版本与计算机上安装的软件包版本相同时,显式不会发送软件包级检测消息。
这种静态数据的位置在BA清单中,但在v3.8中它不包含产品代码。请file a feature request。