如果正在安装数据库功能,我有一个设置为1的属性:
<Property Id="DBFLAG" Value="0" />
<CustomAction Id="DbCheck" Return="check" Execute="immediate" Property="DBFLAG" Value="1" />
<InstallExecuteSequence>
<Custom Action="DbCheck" After="CostFinalize"><![CDATA[&ft_db=3]]></Custom>
</InstallExecuteSequence>
在另一个功能中,我检查这个DBFLAG以查看它是0还是1,基于此我想立即开始服务:
<Component Id="cmp_Svc" Guid="99481212-F2E0-4B6E-934D-0994815C31ED">
<File Id="FILE01" Source="$(var.Service.TargetDir)\Service.exe" KeyPath="yes" />
<ServiceInstall Id="Svc" Name="My Service" Type="ownProcess" Account="[WIX_ACCOUNT_LOCALSYSTEM]" Description="My Service." DisplayName="My Service" ErrorControl="normal" Interactive="no" Start="auto" Vital="no" />
</Component>
<Component Id="cmp_SvcC_Start" Guid="2ED5DBC7-BD42-4D46-AB18-E82DB0E317AD">
<Condition>DBFLAG=1</Condition>
<ServiceControl Id="SvcC_Start" Name="My Service" Remove="uninstall" Stop="both" Wait="yes" Start="install" />
</Component>
<Component Id="cmp_SvcC" Guid="5769A35B-FD61-45D4-8113-40FB762B79C6">
<Condition>DBFLAG=0</Condition>
<ServiceControl Id="SvcC" Name="My Service" Remove="uninstall" Stop="both" Wait="yes" />
</Component>
但是,如果安装了数据库功能,它始终运行cmp_SvcC而不是cmp_SvcC_Start服务。我已经检查了日志,并且可以看到在运行cmp_SvcC和cmp_SvcC_Start之前DBFLAG设置为1但是仍然运行cmp_SvcC,即使条件仅在DBFLAG = 0时也是如此。
如果我将DBFLAG的初始值更改为1,则运行cmp_SvcC_Start。
有没有人知道为什么会这样?
答案 0 :(得分:2)
这种方式不起作用。即使您通过属性间接进行,也无法使用要素操作来调整组件。
正确的方法是在影响其安装的所有功能之间共享您的组件。这是通过FeatureComponents table完成的。
答案 1 :(得分:2)
另一种方法是在StartServices自定义操作本身上有一个条件。像这样:
<InstallExecuteSequence>
<StartServices Sequence="5900">
<![CDATA[VersionNT AND DBFLAG="1"]]>
</StartServices>
</InstallExecuteSequence>
为了弄清楚您想要使用的序列号,请使用Orca打开您的msi,查看InstallExecuteSequence表并在序列号后对表进行排序。