1

安装 MSP 补丁后,Windows Installer 决定安装初始 MSI 中提供的所有功能。如何防止 MSP 补丁安装所有可用功能?

功能请求显示如下:

Installed: Absent
Request: local
Action : local

为什么要求全部安装?

4

2 回答 2

1

我发现 ADDLOCAL 属性被设置为所有未安装的功能。这导致每个人都有一个“请求:本地”。我为解决这个问题所做的是使用一个小的自定义操作来删除这个属性。它需要在 CostFinalize 之前进行,因为需要在该操作之前定义要安装的功能。变量 REINSTALL 保存已安装的功能,并且所有这些功能都需要重新安装。因此,MSP 补丁仅重新安装已安装的功能,而未触及已卸载的功能。

<CustomAction Id="REMOVE_ADDLOCAL_PROPERTY"
       Property="ADDLOCAL" Value="[NonExistentProperty]"
/>
<InstallExecuteSequence>
    <Custom Action="REMOVE_ADDLOCAL_PROPERTY" Before="CostFinalize">
        <![CDATA[PATCH]]>
    </Custom>
</InstallExecuteSequence>

编辑:最后,这个解决方案适用于我的一个补丁,但对另一个失败。所以到目前为止我实施的最终解决方案是在补丁期间设置 REINSTALL=ALL。这个 MSDN 链接表明:

请注意,即使将 REINSTALL 设置为 ALL,也只会重新安装之前已安装的那些功能。因此,如果为尚未安装的产品设置了 REINSTALL,则根本不会执行任何安装操作。

所以我认为这是一个比删除ADDLOCAL属性更好的解决方案。它也适用于两个补丁。

于 2012-09-10T19:58:00.837 回答
0

您必须在初始安装时将所选功能保存到注册表,ADDLOCAL属性。安装补丁时,它必须相应地从注册表设置ADDLOCAL属性中读取状态。

否则,补丁会像选择默认值一样运行,因此会安装缺少的功能。

您链接到升级案例的问题MigrateFeatures,引用MigrateFeatureStatesaction的属性在补丁的情况下不起作用。

于 2012-09-07T12:03:20.020 回答