Visual studio 2010 WiX库项目不适合共享组件定义(并且没有办法参数化Guid),这是对的吗?

Visual studio 2010 WiX库项目不适合共享组件定义(并且没有办法参数化Guid),这是对的吗?,visual-studio-2010,wix,Visual Studio 2010,Wix,WiX组件通常都应该有一个Guid属性,因此如果我想移动组件的定义,例如iis:WebAppPool和iis:WebVirtualDir的组件(或另一个示例-具有权限的内容日志文件夹的组件)在WiX库项目中我将无法使用不同的guid重用这些定义。。。对我来说这是一个问题,我想分享定义不同组件的定义(使用不同的guid) 没有办法做点什么 我尝试通过属性设置guid,如 <Component Name="cmpKuku" Guid="[cmpGUID]" /> 但这不起作用=>组

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

没有办法做点什么

我尝试通过属性设置guid,如

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

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

Guid=“*”是可计算的,但据我所知,它只取决于组件的内容,而不取决于父级、产品和功能?如果在不同的特性/产品中引用,wix为*


x) 我们是否有其他方法来共享iis:WebVirtualPage和iis:WebAppPool定义,而不使用框架组件

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

例如,假设有一个a.wixlib包含一些组件。然后创建两个单独的安装程序,b.msi和c.msi,引用相同的wixlib并安装它们。Windows安装程序将组件的引用计数设置为2。 稍后您决定卸载b.msi。Windows installer将组件的引用计数减少到1,但尚未卸载它。原因是wixlibs就像合并模块一样用于共享组件()。因此,在卸载c.msi之后,只删除该组件

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


编辑:为了避免在星号方面误导人们,使用星号并不是一种坏的做法,因为这可能是构建准备升级的产品的最简单方法,因为升级需要生成新的GUID。因此,如果构建中没有额外的复杂性,那么使用星号可能很好。

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

例如,假设有一个a.wixlib包含一些组件。然后创建两个单独的安装程序,b.msi和c.msi,引用相同的wixlib并安装它们。Windows安装程序将组件的引用计数设置为2。 稍后您决定卸载b.msi。Windows installer将组件的引用计数减少到1,但尚未卸载它。原因是wixlibs就像合并模块一样用于共享组件()。因此,在卸载c.msi之后,只删除该组件

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


编辑:为了避免在星号方面误导人们,使用星号并不是一种坏的做法,因为这可能是构建准备升级的产品的最简单方法,因为升级需要生成新的GUID。因此,如果构建中没有额外的复杂性,那么使用星号就可以了。

对组件使用
guid=“*”
时,它不是生成的,而是计算出来的。看到了吧,我指的就是那个稳定的guid。每次构建项目时都是一样的
guid=“*”
在其他位置表示每次生成项目时都会生成一个新的guid。我只是想澄清一下,谢谢Paulius,但是如果我需要不同的场景:“不稳定的gui”(实际上这就是我想要的),这意味着每个“wix库引用”案例都是可变的?例如,日志文件夹定义,具有所有权限。。。每个my app都包含相同的日志文件夹组件定义(guid除外),并且日志文件夹位于不同的目录中。。。因此,我需要以某种方式参数化guid。在一个应用程序中使用一个guid,在另一个应用程序中使用第二个guid。怎么办?@Wintel:这给我带来了希望。你能分享一下如何计算guid=*?组件guid的计算是否取决于父级?产品和功能?这将是完美的。一个更图形化的例子将是受欢迎的,但这种情况让我想起了我以前见过的一些东西。您可以使用外部脚本在构建之前在组件中放置预生成的guid。因此,例如,您可能预先生成了两组guid,并在构建之前使用特定参数运行脚本,这将根据需要插入它们。虽然在这种情况下,整个“共享组件”的事情没有意义