使用WiX 3.5,我有一个带有实例转换的MSI,允许我在具有不同产品名称的同一台机器上安装软件.为此,我在条件定义的.wxs文件中有一个"硬编码"的产品ID和名称列表.但是,我只有一个包含文件和非文件资源的Feature-ComponentRef定义.
安装似乎工作正常,但卸载实例演示了这两个来源中提到的行为:
http://msdn.microsoft.com/en-us/library/aa367797(v=VS.85).aspx
和
具体来说,除了我的应用程序的最后一个实例之外,没有任何非文件资源(在这种情况下,注册表项)被卸载.(即,如果我按此顺序卸载:instance1,instance2和instance3 - 只删除instance3的非文件资源.
我假设这与非文件组件没有唯一的GUID有关(而这对文件组件来说不是问题)
所以,我想知道一个有效的方法是使用一个产品ID,名称和一组功能来定义单个.wxs文件,但是有一个自定义引导程序为产品和非文件组件生成新的GUID然后插入在运行时进入MSI数据库?即,当需要卸载或更新时,我会在注册表中查询已安装的实例并检索其GUID.
这将允许在运行时创建实例,而不是事先在.wxs中进行硬编码,并且可以干净地卸载.
那有意义吗?Burn会让一切变得更好吗?:)
小智 4
从版本 v3.6.1511.0 开始,组件现在有一个“MultiInstance”属性。这允许根据 Josh Rowes 在 WiX 邮件列表的帖子中的建议,为每个实例动态生成一个 guid(请参阅 OP 中的链接)。我已经测试过,这可以正常工作,导致在卸载当前实例时删除注册表数据,而不是在卸载最后一个实例时删除注册表数据。