WiX:将 MultiInstance 属性设置为 yes 是否会为每个实例转换生成唯一的组件 ID,即使使用静态 guid 时也是如此?

WiX: Does setting MultiInstance attribute to yes generate unique component IDs for each instance transform, even when static guids are used?

我有两个 msi 包,它们由引导程序触发并一起安装产品。我为每个 msi 定义了多个实例 t运行sforms,我想将 MultiInstance 属性设置为 'yes' 用于收集的片段中的所有组件,以便每个实例 t 生成一个新的组件 GUID 运行变形。 (目前看来,没有可以设置的热参数来执行此操作,必须通过 xslt t运行sformation 来完成。)

我想为 Heat 使用 -gg 标志来自动生成静态 GUID,因为安装目录是在 运行-time 期间作为参数设置的,不一定是标准目录。

基本上,输出应该如下所示:

<Fragment>
    <DirectoryRef Id="TARGETDIR">
        <Component Id="cmp32EAD7F5A154CBFA668F294AEEE77B45" Guid="{6529235A-EE06-47EB-A56B-1D016B2396CF}" MultiInstance="yes" >
            <File Id="fil3F2F6C0F947339E1ED2CF4459569CC5A" KeyPath="yes" Source="$(var.BIN)\File1.txt" />
        </Component>
    </DirectoryRef>

...等等

我想知道,即使 GUID 是硬编码的,因此链接器不会生成它(如上所示,而不是 Guid="*"),MultiInstance 属性是否会设置为 'yes' 为每个实例 t运行sforms 的组件生成唯一的 guids?当我通过传入文件的组件 guid 来测试调用 MsiGetProductCode 时,我对此感到困惑,其定义如下:

  <Component Id="ProductComponent" Guid="{1C149757-1E1D-424D-AF77-A156CB87F0BF}" MultiInstance="yes">
    <!-- TODO: Insert files, registry keys, and other resources here. -->
    <File Id="Picture1" Source="C:\Users\Public\Pictures\Sample Pictures\Desert.jpg" ProcessorArchitecture="x64" />
  </Component>

* 这是为定义的所有实例 t运行sforms 安装的测试文件。

我安装了两个来自 msi 的实例(Instance1、Instance2)和 MsiGetProductCode 函数 运行 作为在卸载期间执行的自定义操作的一部分。在第一次执行 MsiGetProductCode 时,我得到了 Instance1 的 ProductCode。在第二次执行 MsiGetProductCode 时(在删除 Instance1 之后),我得到了 Instance2 的 ProductCode。似乎静态组件 ID 已用于两个实例 t运行sforms.

由设置为 'yes' 的 MultiInstance 属性生成的唯一组件 ID 是否应该替换该可见组件 GUID?我没有遇到任何问题,某些文件或注册表值由于仍在使用的组件而未被删除。基本上,我想确认每个实例都生成了唯一的 guid,并且使用 MultiInstance 属性来确保不会发生组件 ID 冲突是安全的,即使在使用静态 guid 时也是如此。有人可以详细说明这是如何在后台工作的吗?

非常感谢!

只需记录安装即可轻松确认 WiX 行为。考虑以下代码:

           <Component Id="test" Guid="{EAF11690-2396-4EBE-A74D-37FA1751BBC3}" MultiInstance="yes">
              <File Id="test" Source="C:\windows\notepad.exe" KeyPath="yes" />
            </Component>

 <InstanceTransforms Property="INSTANCEID">
      <Instance Id="I01" ProductCode="{7474D99A-B56C-4767-B437-52F56746274A}" ProductName="ProductName2-1" UpgradeCode="{7C2BE622-7543-4F22-A0ED-A9FD28C78C8A}"/>
     </InstanceTransforms>

记录基础安装和辅助安装显示 GUID 是唯一的/已转换。

另一个想法是从 MSI 中提取实例转换并使用 ORCA 应用它以查看差异。

MSI (s) (E4:A4) [10:36:37:021]: Executing op: ComponentRegister(ComponentId={EAF11690-2396-4EBE-A74D-37FA1751BBC3},KeyPath=C:\Program Files (x86)\MyCompany\ProductName2\notepad.exe,State=3,,Disk=1,SharedDllRefCount=0,BinaryType=0)

MSI (s) (E4:DC) [10:37:04:234]: Executing op: ComponentRegister(ComponentId={BEC4E6A5-9CFB-5C77-A854-CC0179CFEDCE},KeyPath=C:\Program Files (x86)\My Company\ProductName2\notepad.exe,State=3,,Disk=1,SharedDllRefCount=0,BinaryType=0)