我有一个相对通用的Wix(3.8)项目,因为我们尝试使用各种工具(如预处理器)来生成多个Demo安装程序,以更改名称,包含不同的文件和选项。我还修改了每个ProductId / ProductCode / UpgradeCode,以便它们显示为2个不同的产品并且并排安装。单独安装和卸载一个工作正常。当我并排安装2个并卸载一个时,有几个被遗弃的资源,其中一个是快捷方式。
以下是我用于快捷方式的代码:
<DirectoryRef Id="DesktopFolder">
<Component Id="DesktopShortcuts"
Guid="*">
<Shortcut Id="ApplicationDesktopShortcut"
Name="!(bind.property.ProductName)"
Description="Demo Application"
Target="[INSTALLDIR]Demo.exe"
WorkingDirectory="INSTALLDIR"
Advertise="no"/>
<RegistryKey Root="HKMU"
Key="SOFTWARE\$(var.Manufacturer)\!(bind.property.ProductCode)\DesktopShortcuts">
<RegistryValue Name="Installed"
Type="integer"
Value="1"
KeyPath="yes" />
</RegistryKey>
</Component>
</DirectoryRef>
在查看安装程序日志后,我注意到快捷方式的ComponentId始终相同,这解释了废弃的资源(快捷方式)。
我的印象是因为我的注册表值的路径对于每个安装程序是不同的(请注意我将产品代码绑定到密钥中)我会因为Guid =&而为每个安装程序获得不同的Guid #34; *&#34;属性。但是,wix文档不清楚WRT注册表项,我找到的其他讨论也是如此。显然,对于位于不同目录中的文件,这不是问题。
答案 0 :(得分:3)
所以我弄清楚发生了什么。这一切都与这条线上的一些微妙问题有关:
Key="SOFTWARE\$(var.Manufacturer)\!(bind.property.ProductCode)\DesktopShortcuts">
如问题中所述,文档和参考资料表明文件和注册表项的路径用于动态生成Guid。请注意,路径包括文件/值名称。这实际上正在发生但是我如何使用2个不同的ProductCodes为2个不同的安装程序获得ComponentId的相同Guid?你会认为将ProductCode包含在路径中会使每个都是唯一的。事实证明,这是因为我在路径中使用了!(bind.property.ProductCode)。在光线链接阶段之前,粘合剂变量不会被替换。 Guid =“*”元素是在编译阶段使用Candle生成的,显然是在链接器之前。因此,当替换发生并且在注册表中生成正确的密钥时,Guid是从非唯一路径生成的:
SOFTWARE\MyCompany, Inc\!(bind.property.ProductCode)\DesktopShortcuts\Installed
因此,在使用自动生成的Guid功能时,请勿在任何KeyPath元素中使用binder变量。