MSI - 是否可以确定其他产品是否已安装共享组件

时间:2014-06-03 09:38:14

标签: wix installer windows-installer

有人可以在以下情况中解释奇怪的MSI行为:

我有多个Wix项目,它们共享包含单个组件的相同功能:

<Feature Id="VTWSK" Level="1" Directory="MyCommonFolder">
  <Component Id="vtwsk" Guid="{47EC2941-738D-4486-9D86-A443A40C5F94}" Directory="TempDriversFolder">
    <File Id="vtwsk.key" Source="..." KeyPath="yes"/>
    ...
  </Component>
</Feature>

我确保所有产品都将MyCommonFolder解析为同一目标目录,以便组件密钥路径确实相同。我还有一个自定义操作,应该在时执行,并且仅当组件首次安装在目标计算机上时,所以我使用以下条件:

<InstallExecuteSequence>
  <Custom Action="InstallVTWSK" After="InstallFiles">$vtwsk=3</Custom>
</InstallExecuteSequence>

当第一个产品安装在目标计算机上时,它可以正常工作,但是,第二个产品无法检测到已经安装了vtwsk组件。来自第二个产品安装的日志:

MSI (s) (B0:AC) [13:18:22:202]: Feature: VTWSK; Installed: Absent;   Request: Local;   Action: Local
...
MSI (s) (B0:AC) [13:18:22:202]: Component: vtwsk; Installed: Absent;   Request: Local;   Action: Local;   Client State: Unknown

因此,组件状态仍然是3,并且第二次执行相应的自定义操作(并且由于我无法轻易控制其性质而失败)。我宁愿期待&#34;已安装:本地;要求:本地;行动:空虚&#34;。

是否有可能仅在首次在目标计算机上安装组件(或功能)时有条件地运行自定义操作?

1 个答案:

答案 0 :(得分:2)

所有其他事情都是正确的,发生的事情是每次都安装组件,以便条件成立。仍然有两到三个产品安装该组件,并且该位置的引用计数增加,并且存在一个文件的事实不相关。每个产品仍在安装该组件。您确实希望在第一次安装文件时运行该CA.我会考虑让CA创建一个注册表项,说明文件已初始化,并使用它来查看是否需要初始化。或者以其他方式使CA足够聪明,看到初始化已经完成,所以你每次都要调用它。或者,如果文件存在的事实足够,那么您可以搜索文件的组件ID,如果它在那里,则可能假设它已被先前的安装初始化。