我有一个WiX捆绑包,其中包含。NET核心运行时安装程序和我的产品MSI。如果我不做任何调整,我会在"添加/删除程序"列表中得到两个条目——一个用于捆绑包,一个用于产品MSI。我尝试过两种只显示一个的方法,但无论哪种方法,我都会遇到一些问题。
方法#1-设置MsiPackage属性";可见的";至";否";在捆绑包中。这将在"添加/删除程序"(针对捆绑包(中留下一个条目。
这里的问题是,如果他们使用捆绑包进行初始安装,但后来只安装MSI进行升级,他们会在"添加/删除程序"列表中获得两个条目-原始捆绑包和新产品。
方法#2-将Bundle属性DisableRemove和DisableModify都设置为";是";在捆绑包中。这提供了一个单独的"添加/删除程序"条目-这次是针对产品MSI,而不是捆绑包。
这里的问题是以下顺序:
- 安装捆绑包版本10
- 卸载ARP条目(产品MSI(
- 安装捆绑包版本9
第三步失败,因为系统仍然安装了版本10的捆绑包。
我们的捆绑包是30MB,我们的产品是3MB。当我知道的时候,我不想让每个后续更新都下载另一个捆绑包。NET已经存在,没有必要。那么,我可以使用什么方法最初安装捆绑包,但后来用MSI更新,而不会遇到上述问题?
EDIT:我能想到的唯一方法是在卸载时进行自定义操作,该操作检测MSI是否是通过捆绑包发送的(而不是独立的(,如果不是,则使用类似MsiEnumRelatedProducts((的方法来查找捆绑包的产品guid,并对其进行内联卸载。看起来非常混乱,我不确定它是否会起作用,或者调用是否会达到某种";安装程序已在运行";错误
在MSI安装程序的属性表中(或从命令行(设置ARPSYSTEMCOMPONENT=1将阻止它在添加或删除程序中显示。所以,你的第一种方法应该在这个变化之后起作用。
我认为这里最简单的解决方案是从不分发MSIs并创建两个版本的捆绑包-一个只包含我们的包,另一个包含我们的软件包和。NET运行时。始终将嵌入的MSI标记为可见=否,并在ARP中显示捆绑包的条目。这确保了捆绑包总是更新捆绑包,ARP显示正确的版本,并且在卸载时不会留下任何东西。
我试图在MSI卸载上实现一个自定义操作,以查询捆绑包的升级代码并手动删除它。不幸的是,WiX捆绑包并没有作为正常产品显示在系统中。因此,虽然我可以手动解析注册表,但不能使用更健壮的API,如MsiEnumRelatedProducts((。因此,我认为捆绑一个是我目前最好的解决方案。