2

WiX 组件通常都应该有一个Guid属性,所以如果我想将组件的定义(例如 iis:WebAppPool 和 iis:WebVirtualDir 的组件)(或另一个示例 - 包含具有权限的日志文件夹的组件)移动到WiX 库项目中我将无法使用不同的 guid 重用这些定义......对我来说这是一个问题,我想共享定义以定义不同的组件(具有不同的 guid)!

而且没有办法做点什么。

我试图通过像这样的属性来设置 guid

<Component Name="cmpKuku" Guid="[cmpGUID]" />

但这不起作用 => 组件的 GUID 不接受参数。可能还有其他方法可以参数化组件的 guid 吗?当然,在 Wix 库项目的情况下,通过预处理器变量进行参数化也不起作用。

Guid="*" 是可计算的,但据我了解,它仅取决于组件的内容,而不取决于父母、产品、功能?如果在不同的功能/产品中引用,wix 为 * 计算不同的 guid,这对我有好处。

x) 我们是否有其他方式来共享 iis:WebVirtualPage 和 iis:WebAppPool 定义,而无需框架组件?

4

1 回答 1

4

我读过完全相同的帖子。Rob Mensching 这么说的原因是您不能将 wixlibs 与其他工具一起使用,因为它们是特定于 wix 的。但是,wixlibs 和合并模块都非常相似(尽管 wixlibs 是更好/更快和更新的选择)。因此,要回答您的问题,是的,您可以使用 wixlibs 来包含组件,因为正如我上面提到的,它们类似于合并模块。本质上,单个共享组件在其整个生命周期内必须具有相同的 GUID,并且 Windows 安装程序知道如何跟踪它们。

因此,例如,假设您有一个包含某些组件的 a.wixlib。然后创建两个单独的安装程序 b.msi 和 c.msi,引用相同的 wixlib 并安装它们。Windows 安装程序将组件的引用计数设置为 2。稍后您决定卸载 b.msi。Windows 安装程序将组件的引用计数减少到 1,但尚未卸载它。原因是wixlibs,就像合并模块一样用于共享组件(http://msdn.microsoft.com/en-us/library/windows/desktop/aa369820(v=vs.85).aspx)。因此,在您卸载 c.msi 后,只会删除该组件。

还有一件事。您可以通过放置 guid="*" 属性在链接期间生成 GUID。我通常反对它,但它是有效的。

编辑:为了避免误导人们对星号,使用它们并不是一个坏习惯,因为这可能是构建准备升级的产品的最简单方法,因为对于升级,无论如何您都需要生成一个新的 GUID。因此,如果构建中没有额外的复杂性,使用星号可能就可以了。

于 2012-04-22T17:56:54.943 回答