如何让wixtool制作的msi安装包默认安装到自身所在目录
实现方案
1. 核心逻辑说明
MSI 内置的OriginalDatabase属性存储了当前运行的安装包完整路径,我们只需要提取该路径的目录部分,覆盖默认安装目录属性,再移除路径选择的UI页面即可实现需求。
2. 新增自定义动作提取MSI所在目录
在你的.wxs项目文件中添加以下自定义动作定义,用于解析MSI所在目录并赋值给安装目录属性:
<!-- 这里以Wix默认的WIXUI_INSTALLDIR作为安装根目录属性,如果你用自定义的INSTALLDIR可直接替换 --> <CustomAction Id="SetInstallDirToMsiPath" Property="WIXUI_INSTALLDIR" Value="[OriginalDatabase]" Execute="immediate" /> <!-- 自定义动作截断MSI文件名,只保留所在目录路径 --> <CustomAction Id="GetMsiParentDir" Script="vbscript" Execute="immediate"> <![CDATA[ Dim fullPath, parentDir fullPath = Session.Property("WIXUI_INSTALLDIR") parentDir = Left(fullPath, InStrRev(fullPath, "\")) Session.Property("WIXUI_INSTALLDIR") = parentDir ]]> </CustomAction>
3. 调整执行序列保证路径提前生效
需要将自定义动作加入UI序列和执行序列,确保在安装路径校验前完成赋值,静默安装场景也能生效:
<InstallUISequence> <Custom Action="SetInstallDirToMsiPath" Before="CostInitialize" /> <Custom Action="GetMsiParentDir" After="SetInstallDirToMsiPath" /> </InstallUISequence> <InstallExecuteSequence> <Custom Action="SetInstallDirToMsiPath" Before="CostInitialize" /> <Custom Action="GetMsiParentDir" After="SetInstallDirToMsiPath" /> </InstallExecuteSequence>
4. 移除安装路径选择UI页面
如果你使用Wix默认的WixUI_InstallDir模板,重写UI跳转逻辑跳过目录选择页即可:
<UI> <UIRef Id="WixUI_InstallDir" /> <!-- 直接从欢迎页跳转到许可协议页,跳过InstallDirDlg路径选择页,可根据自己的UI流程调整跳转目标 --> <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="LicenseAgreementDlg">1</Publish> <Publish Dialog="LicenseAgreementDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg">1</Publish> </UI>
注意事项
- 如果自定义了安装根目录的属性名,替换所有代码中的
WIXUI_INSTALLDIR为你自己的属性名即可 - 如果对VBScript兼容性有要求,可以替换为C#编写的自定义动作实现路径截断逻辑,稳定性更高
- 测试时需要将生成的MSI放到目标目录下双击运行,不要直接在Visual Studio中启动调试验证效果
内容的提问来源于stack exchange,提问作者Zader
相关产品推荐
相关产品推荐

