0

我有一个产品,它包含几个功能(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 操作之后根据其他功能的安装状态设置此功能的安装状态,但这会使不同的安装逻辑复杂化场景(安装、重新配置、回滚、卸载)并使其更容易出错。

你有什么建议?

4

1 回答 1

0

最终,我为仅包含 windows-service 组件的功能 C 创建了一个子功能,并使用在 CostFinalize 之后安排的两个 MsiSetFeatureState 自定义操作来控制其安装状态 - 一个用于将状态设置为不存在以防安装功能 C 或重新配置并设置了 'legacy-mode' 标志,另一个将状态设置为 install-local 以防安装或重新配置功能 C 并且未设置 'legacy-mode' 标志。windows-service 组件仍然在功能 A、功能 B 和功能 C 的这个子功能之间共享。这似乎工作得很好!

于 2013-02-18T08:39:20.933 回答