我有一个产品,它包含几个功能(A、B、C),所有这些都共享一个通用的 Windows 服务组件。问题是有一个最终情况:如果只安装了一个特定功能(功能 C),带有“旧模式”标志(保存在注册表中的某些属性),那么这个 windows-service 组件不应该安装或将其启动类型从“自动”更改为“禁用”。与禁用的启动类型解决方案相比,我更喜欢“未安装”解决方案。
在所有其他情况下:当安装了除此功能 (C) 之外的其他功能 (A,B) 时,或者未设置 'legacy-mode' 标志时 - 应安装 windows-service 组件并应设置其启动类型为“自动”。
如果产品被重新配置,则应重新评估条件并针对这两种情况采取适当的行动。
问题是不可能在 windows-service 组件条件中使用功能的安装状态,因为功能的安装状态和组件的条件都是在同一个 CostFinalize 操作中评估的(请参阅:http://www.joyofsetup .com/2008/04/09/feature-states-in-component-conditions/)此外,使用在自定义操作中删除组件的方法不起作用,因为非传递组件不能从现有功能中删除,除非这是重大升级(参见http://blogs.msdn.com/b/heaths/archive/2010/02/15/test-your-conditions.aspx)
我可以将组件分离为它自己的不同功能,并尝试编写自定义操作,在 CostFinalize 操作之后根据其他功能的安装状态设置此功能的安装状态,但这会使不同的安装逻辑复杂化场景(安装、重新配置、回滚、卸载)并使其更容易出错。
你有什么建议?