我有两个由引导程序触发并同时安装产品的msi软件包。我为每个msi定义了多个实例转换,我想将MultiInstance属性设置为' yes'对于所收集的片段中的所有组件,使得每个实例变换将生成新的组件GUID。 (现在似乎没有一个热量参数可以设置为执行此操作,并且必须通过xslt转换来完成。)
我想使用-gg标志为Heat自动生成静态GUID,因为安装目录在运行时作为参数设置,不一定是标准目录。
基本上,输出应该如下:
<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 =&#34; *&#34;),MultiInstance属性是设置为“是”&#39;为每个实例变换生成唯一的guid&#39;组件?当我测试调用MsiGetProductCode并通过传入一个文件的组件guid时,我对此感到困惑,其定义如下:
<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>
*这是为所有定义的实例转换安装的测试文件。
我安装了msi的两个实例(Instance1,Instance2),并且MsiGetProductCode函数作为卸载期间执行的自定义操作的一部分运行。在第一次执行MsiGetProductCode时,我获得了Instance1的ProductCode。在第二次执行MsiGetProductCode时(删除了Instance1之后),我得到了Instance2的ProductCode。似乎静态组件id已用于两个实例转换。
MultiInstance属性生成的唯一组件ID是否设置为“是”&#39;不应该替换那个可见的组件guid?由于仍在使用某个组件,我没有任何问题,因为某些文件或注册表值未被删除。基本上,我想确认每个实例都生成了唯一的guid,并且使用MultiInstance属性可以确保不会发生组件ID冲突,即使在使用静态guid时也是如此。有人可以在后台详细说明这是如何工作的吗?
提前多多感谢!
答案 0 :(得分:2)
It's pretty easy to confirm WiX behavior just by logging the install. Consider the following code:
<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>
Logging the base and secondary installation reveals that the GUID is unique / transformed.
Another thought would be to extract the instance transform from the MSI and apply it using ORCA to see the differences.
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)