WiX Installer使用RegistrySearch指定安装目录问题排查
问题根源
你的配置读不到注册表值、安装路径错误是两个核心问题导致的:
- 32位注册表重定向问题:WiX v3默认的
RegistrySearch会以32位进程视角搜索注册表,在64位系统上搜索HKLM\SOFTWARE路径时,会被系统自动重定向到HKLM\SOFTWARE\Wow6432Node路径。你安装的SolidWorks 2022是64位版本,对应注册表项在64位系统的原生注册表路径下,32位搜索根本找不到对应键值,所以SOLIDWORKSDIR属性为空。 - 目录默认值配置错误:当
SOLIDWORKSDIR属性为空时,你给对应Directory节点设置的Name="."会让Windows Installer将该目录默认解析为系统盘根目录(通常是C:\),最终就出现了文件被安装到C:\My Company\SolidWorks Add-In的现象。
修改方案
- 给注册表搜索项添加
Win64="yes"属性,明确指定搜索64位原生注册表视图,避开Wow64重定向。 - 增加兜底校验逻辑:如果注册表搜索失败(也就是用户机器上没装对应版本SolidWorks),弹出提示并终止安装,避免文件被装到错误位置。
- 修正目录配置,移除搜索属性对应目录节点上错误的
Name="."配置。
修改后的核心配置代码
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> <Product Id="*" Name="SolidWorks Add-In" Language="1033" Version="1.0.0.0" Manufacturer="My Company" UpgradeCode="073e3b99-1977-4a3e-a4dc-0d61cc6ddbee"> <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" Description="SolidWorks Add-In Installer" Manufacturer="My Company" /> <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." /> <MediaTemplate EmbedCab="yes" CompressionLevel="high" /> <Feature Id="ProductFeature" Title="Installer" Level="1"> <ComponentGroupRef Id="ProductComponents" /> </Feature> <Property Id="MsiLogging" Value="v" /> <!-- 新增Win64="yes"指定搜索64位注册表 --> <Property Id="SOLIDWORKSDIR"> <RegistrySearch Id="SolidWorksRegistry" Type="raw" Root="HKLM" Win64="yes" Key="SOFTWARE\SolidWorks\SOLIDWORKS 2022\Setup" Name="SolidWorks Folder" /> </Property> <!-- 新增校验逻辑:未找到SolidWorks路径时弹出提示终止安装 --> <Condition Message="未检测到本机安装SolidWorks 2022,安装即将终止。"> <![CDATA[Installed OR SOLIDWORKSDIR]]> </Condition> </Product> <Fragment> <Directory Id="TARGETDIR" Name="SourceDir"> <!-- 移除错误的Name="."配置 --> <Directory Id="SOLIDWORKSDIR"> <Directory Id="My_Company" Name="My Company"> <Directory Id="INSTALLFOLDER" Name="SolidWorks Add-In" /> </Directory> </Directory> </Directory> </Fragment> <Fragment> <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER"> <!-- 64位安装场景下组件标记Win64属性 --> <Component Id="AutofacLibrary" Guid="3124c97d-079d-48fe-bc7c-e594bf49ae4a" Win64="yes"> <File Id="AutofacDLL" Name="Autofac.dll" DiskId="1" Source="..\SolidWorksAddIn\bin\Release\Autofac.dll" KeyPath="yes" /> <File Id="AutofacPDB" Name="Autofac.pdb" DiskId="1" Source="..\SolidWorksAddIn\bin\Release\Autofac.pdb" /> </Component> </ComponentGroup> </Fragment> </Wix>
额外说明
- 因为你的安装包是perMachine全局安装范围、面向64位SolidWorks,对应的组件也建议加上
Win64="yes"标记,避免被系统重定向安装到32位程序目录。 - 如果后续需要兼容多个SolidWorks版本,可以追加多个不同版本路径的
RegistrySearch,按版本优先级依次搜索赋值即可。
内容的提问来源于stack exchange,提问作者peinearydevelopment
相关产品推荐
相关产品推荐

