在Windows安装XML工具集中,要安装服务,我们会在<ServiceInstall>
中将<File>
与<Component>
分组。为了有条件地安装服务,我们将<Condition>
置于<Component>
下。但是,如果条件为false,则也不会安装该文件。如果我将<File>
置于无条件<Component>
中,则该服务没有可执行文件路径,因此安装将失败。如果我将<File>
放在<Component>
中,则会找到重复的符号。
问题是,我们可以有条件地安装服务,但无条件地安装相关的可执行文件吗?
谢谢!
答案 0 :(得分:6)
使用不同的GUID和Ids以及互斥条件创建两个组件:一个用于文件和服务,另一个用于文件。像这样:
<Component Id="SvcComp" Guid="{YOUR-GUID}" SharedDllRefCount="yes">
<Condition> SOME_CONDITION </Condition>
<File Id="SvcFile" Name="Service.exe" Source="Service.exe" Vital="yes" />
<ServiceInstall Id="Svc" Name="Service" DisplayName="Service" Description="Service" Type="ownProcess" Start="auto" ErrorControl="normal" Vital="yes" />
<ServiceControl Id="Svc" Name="Service" Stop="both" Remove="uninstall" Wait="yes" />
</Component>
<Component Id="ExeComp" Guid="{YYOUR-GUID}" SharedDllRefCount="yes" >
<Condition> NOT SOME_CONDITION </Condition>
<File Id="ExeFile" Name="Service.exe" Source="Service.exe" Vital="yes" />
</Component>
您将收到LGHT1076警告,因为组件中的条件是互斥的,所以可以取消该警告。
答案 1 :(得分:2)
如果您只有一项服务,则可以在InstallExecuteSequence
表中排除服务操作。
或者,您必须在即时阶段运行CA,这会在延迟执行之前暂时从服务表中删除该条目。
我不是无缘无故分裂dll的粉丝。
答案 2 :(得分:1)
我一直走在这条路上,它变得比人们期望的更快。
我认为有两个组件(尽管它们是互斥的条件表达式)具有相同的密钥文件但不同的ServiceInstall / Control资源违反了组件规则。
我建议这样做的方法是将所有业务逻辑移动到一个单独的DLL组件中,并创建两个不同的EXE组件。将一个设置为控制台/ Windows应用程序,另一个设置为服务应用程序。将组件关联到两个不同的功能,以便最终用户可以决定他想要配置应用程序的方式。然后,用户可以在添加/删除程序中执行修改操作,并使用MSI稍后改变主意。
答案 3 :(得分:0)
这已经很久了,但现在人们往往会有同样的问题。
使用现代WiX实现这一目标的方法是用条件结构包围服务开头,如下所示:
<?if $(var.Configuration) != Debug ?>
<!--whatever stuff you want to do -->
<?endif?>
因此,对于这种情况,您可以在条件之外安装文件,因为您总是需要它,并且在条件中,您将添加ServiceInstall和ServiceControl。