2010-08-13 138 views
9

在Windows安装XML工具集中,要安装服务,我们将<ServiceInstall><File>组合为<Component>。要有条件地安装该服务,我们将<Condition>置于<Component>之下。但是,如果条件为false,则该文件也不会被安装。如果我将<File>置于无条件<Component>中,则该服务没有可执行文件路径,因此安装将失败。如果我将<File>都放在<Component>中,则会找到重复的符号。WiX:有条件安装服务,但无条件安装文件

问题是,我们可以有条件地安装服务,但无条件安装相关的可执行文件吗?

谢谢!

+1

如果ServiceInstall/@ Start属性可以设置为[Property],那将会非常好,因此您仍然可以在不启动服务的情况下安装服务。 – Ivan 2017-01-18 10:29:32

回答

5

使用不同的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警告,因为组件中的条件是互斥的,所以可能会被禁止。

+0

感谢您的建议,我发现我错过的是文件ID。使用不同的Id但名称相同,相同的文件可以存在于不同的''中。 – 2010-08-13 13:09:54

+1

技术上可行,但你会得到ICE验证错误,因为这两个组件具有相同的键路径。这不是一个干净的解决方案。 – 2013-02-12 17:23:46

1

我一直在走这条路,它会变得复杂得更快,然后会有人期待。

我认为有两个组件(尽管它们是互斥的条件表达式)具有相同的密钥文件,但不同的ServiceInstall/Control资源违反了组件规则。

我建议这样做的方法是将所有的业务逻辑转移到一个独立的DLL组件中,并创建两个不同的EXE组件。将其中一个设置为控制台/ Windows应用程序,另一个设置为服务应用程序。将组件关联到两个不同的功能,以便最终用户可以决定他想要配置应用程序的方式。然后用户可以在添加/删除程序中进行修改操作,并在稍后使用MSI改变主意。

2

如果您只有一项服务,则可以排除InstallExecuteSequence表中的服务操作。

或者,您必须在立即阶段运行CA,在延期执行期间暂时从服务表中删除条目。

我不是无缘无故分裂dll的粉丝。

+0

正确的应用程序设计将代码分解为多个程序集中的多个类。创建一个包含服务器组件的程序集,并创建两个程序集以充当控制台主机和服务主机。您提出的建议只会导致不符合最佳做法的黑客MSI。 – 2013-02-12 17:21:59