我有一个基于WiX的安装程序,它为我的应用程序有条件地安装桌面快捷方式。为了实现这一点,我使用了WixUI_InstallDir
UI(因为我只有一个功能(,并修改了VerifyReadyDlg
对话框以显示链接到快捷方式组件条件中使用的属性的复选框。
相关代码:
<Property Id="INSTALLDESKTOPSHORTCUT" Secure="yes" />
...
<Component Id="desktop_shortcut" Guid="xyz">
<Condition>INSTALLDESKTOPSHORTCUT</Condition>
<Shortcut Id="desktopshortcut" Directory="DesktopFolder" Name="The Name"
WorkingDirectory='INSTALLDIR' Icon='app.ico' IconIndex="0" Target="[#app.exe]" />
<RegistryValue Root='HKCU' Key='the/key' Type='string'
Name='desktop_shortcut_key' Value='1' KeyPath='yes' />
</Component>
...
<Feature Id='Complete' Level='1'>
<ComponentGroupRef Id='the_app' />
<ComponentRef Id='desktop_shortcut' />
</Feature>
这在应用程序的初始安装和重大升级期间都能完美工作。也就是说,当用户在其中一种情况下运行MSI时,他们会在安装程序的最后一步中得到复选框,并且快捷方式是否正确安装取决于用户的选择。
但是,如果用户再次运行相同的安装程序,它将输入MaintenanceTypeDlg
,允许在修改、修复和卸载之间进行选择(我已通过ARPNOMODIFY
属性激活了修改选项(。而且,当进行修改或修复流程时,他们会看到我修改后的UI,他们可以选中或取消选中桌面快捷方式的复选框,但它没有效果。当安装程序以这两种模式之一运行时,快捷方式永远不会更改(既不安装也不删除(。
这在修复模式下是有意义的,但当使用修改选项时,我希望可以更改已安装的组件集。有办法做到这一点吗?我做错什么了吗?
注意:我怀疑如果我使用Feature
安装快捷方式,这会起作用。我不这么做有两个原因:这与标准UI不匹配(快捷方式通常是通过自定义复选框选择的,而不是作为功能树中的一个功能(,使用这种方法需要将我的所有应用程序的组件都包含在快捷方式功能中(否则快捷方式指的是不同的功能(,这会打乱安装大小的计算(仅快捷方式就显示为占用xx MB(。
尝试将受影响组件的Transitive标志设置为yes。
https://wixtoolset.org/documentation/manual/v3/xsd/wix/component.html