6

使用 WiX 3.5,我有一个带有实例转换的 MSI,允许我将软件安装在具有不同产品名称的同一台机器上。为此,我在 .wxs 文件中有条件定义的产品 ID 和名称的“硬编码”列表。但是,我只有一个包含文件和非文件资源的 Feature-ComponentRef 定义。

安装似乎工作正常,但卸载实例演示了这两个来源中提到的行为:

http://msdn.microsoft.com/en-us/library/aa367797(v=VS.85).aspx

http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/Multiple-Instance-Transforms-Walkthrough-Proposed-Simple-Addition-to-WiX-to-Make-Them-Easier-td708828。 html

具体来说,在我的应用程序的最后一个实例中,没有任何非文件资源(在本例中为注册表项)被卸载。(即,如果我按以下顺序卸载:instance1、instance2 和instance3 - 仅删除instance3 的非文件资源。

我假设这与非文件组件没有唯一的 GUID 有关(而这不是文件组件的问题)

所以,我想知道是否一种有效的方法是定义一个具有一个产品 ID、名称和一组功能的单个 .wxs 文件,但是让一个自定义引导程序为产品和非文件组件生成新的 GUID,然后将其插入在运行时进入 MSI 数据库?即,当需要卸载或更新时,我会在注册表中查询已安装的实例并检索它们的 GUID。

这将允许在运行时创建实例,而不是预先在 .wxs 中硬编码,并且可以干净地卸载。

那有意义吗?Burn会让一切变得更好吗?:)

4

2 回答 2

4

As of version v3.6.1511.0, there is now a "MultiInstance" attribute for components. This allows a guid to be generated on the fly for each instance as per Josh Rowes suggestion in his post to the WiX mailing list (see the link in the OP). I have tested and this works correctly to cause registry data to be removed when the current instance is uninstalled, and not when the LAST instance is uninstalled.

于 2011-06-02T16:25:12.303 回答
1

您不需要拥有唯一的组件 ID,但您需要拥有唯一的注册表项。查看:

使用实例转换创作多个实例

文章提到:

为了保持每个实例的非文件数据隔离,基础包应该将非文件数据收集到每个实例的组件集中。然后应根据依赖于实例标识符的条件语句安装适当的组件。

我实际上不知道他们在那里谈论什么。我创建了 n-Tier 多实例安装程序,其中所有文件都由唯一的 INSTALLDIR 隔离(在运行时键入 51 自定义操作以根据 InstanceID 改变目标),并且所有注册表数据都使用 InstanceID 作为路径的一部分进行了变异,如上所述在文章中。我支持多达 16 个具有唯一配置数据和唯一版本号的唯一实例(每个实例都可以通过与其他实例不同的重大升级获得服务。)所有这些都是为了支持 nTier 应用程序的 SaaS 部署模型,而我从来没有曾经必须创建具有独特 GUIDS 和/或条件表达式的组件。

我唯一需要做的就是在客户端,他们想要在桌面上有一个快捷方式。(客户端还支持多个实例,因为站点可能在 Production 中具有 v1.0,在 Test 中具有 v1.1)

因为我无法更改文件夹名称(固定)并且因为 MSI 的 ShortCut 表不支持 formattable,所以我必须编写一个自定义操作以在安装表中使用 InstanceID 动态地将 ShortCut 创作到 TEMP 表中,然后 MSI 创建了我的捷径。

于 2011-02-18T21:49:06.790 回答