如何用Wix Toolset v4实现程序安装至Program Files且快捷方式在当前用户桌面
问题
使用Visual Studio的Wix Toolset v4及Heatwave插件,需实现两个需求:
- 程序安装到
C:\Program Files (x86) - 在当前用户桌面(
C:\Users\{User}\Desktop\)创建快捷方式
调整Package的Scope属性时出现矛盾:
- 设为
perUserOrMachine:快捷方式位置正确,但安装目录变为C:\Users\{User}\AppData\Local\Programs\ - 设为
perMachine:安装目录正确,但快捷方式被放到公共桌面(C:\Users\Public\Desktop)
当前Wix代码如下:
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:ui="http://wixtoolset.org/schemas/v4/wxs/ui"> <Package Name="Package" Manufacturer="Company" Version="1.0.0.0" Scope="perMachine" UpgradeCode="{PUT-GUID-HERE}"> <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" /> <Feature Id="Main"> <ComponentGroupRef Id="ExampleComponents" /> <ComponentGroupRef Id="ShortcutGroup" /> </Feature> <!--Add User Interface dialog--> <ui:WixUI Id="WixUI_InstallDir" InstallDirectory="InstallProductFolder" /> <!--InstallDirectory="DesktopFolder"/--> </Package> </Wix>
解决方案
要同时满足两个需求,需保持Package的Scope为perMachine,同时为快捷方式组件单独指定perUser安装范围,具体配置步骤如下:
- 保留
Package的Scope="perMachine",确保主程序安装到机器级的C:\Program Files (x86)目录 - 在定义快捷方式的
Component中添加Scope="perUser"属性,强制该组件仅部署到当前用户的专属桌面 - 为
perUser类型的组件添加HKCU(当前用户注册表)的RegistryValue作为组件的KeyPath,保证Windows Installer能正确跟踪组件状态
调整后的关键代码示例
1. 快捷方式组件配置
<ComponentGroup Id="ShortcutGroup"> <!-- 为快捷方式组件指定perUser范围 --> <Component Id="ApplicationShortcut" Guid="PUT-YOUR-UNIQUE-GUID-HERE" Scope="perUser"> <Shortcut Id="ApplicationDesktopShortcut" Name="你的程序名称" Description="程序功能描述" Target="[INSTALLFOLDER]YourApplication.exe" WorkingDirectory="INSTALLFOLDER" /> <!-- 必须添加HKCU注册表项作为组件KeyPath --> <RegistryValue Root="HKCU" Key="Software\YourCompany\YourProductName" Name="DesktopShortcutInstalled" Value="1" Type="integer" KeyPath="yes" /> </Component> </ComponentGroup>
2. 安装目录配置(确保指向Program Files)
<Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="ProgramFilesFolder"> <!-- 主程序安装目录 --> <Directory Id="INSTALLFOLDER" Name="YourProductName" /> </Directory> <Directory Id="DesktopFolder" /> </Directory>
核心逻辑说明
Package的perMachine属性决定了主程序的全局安装位置,符合C:\Program Files (x86)的要求- 单个组件的
Scope="perUser"会覆盖包的默认范围,让快捷方式仅出现在当前用户的桌面,而非公共桌面 HKCU注册表项作为KeyPath是perUser组件的必填项,用于Windows Installer识别组件是否已安装到当前用户环境
内容的提问来源于stack exchange,提问作者Duy Tran
相关产品推荐
相关产品推荐

