WIX Toolset制作的reSLIRP MSI误装至x86目录问题排查
问题:WIX Toolset v4制作的MSI安装到32位目录而非64位目录
问题详情
我使用WIX Toolset为reSLIRP制作MSI安装程序,程序被安装到C:\Program Files (x86)目录,而非预期的C:\Program Files目录。
尝试过的解决方法:
- 旧版WIX的
Wix/Package/@Platform="x64"、Component/@Win64="yes",但当前版本不支持 - 现代方案设置
Component/@Bitness="always64",但无效果
WXS代码
<?xml version="1.0"?> <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> <Package Compressed="yes" InstallerVersion="500" Manufacturer="HappyRobotsLTD" Name="reSLIRP" Scope="perMachine" UpgradeCode="12345678-ABCD-0001-0001-250131143054" Version="1.1.0.0"> <StandardDirectory Id="ProgramFiles64Folder"> <Directory Id="INSTALLFOLDER" Name="reSLIRP"> <Component Bitness="always64" Id="ProductComponent"> <File Id="MainExecutable" KeyPath="yes" Source="build\reslirp.exe"/> </Component> <Component Bitness="always64" Id="msys_intl_8_dll"> <File Id="msys_intl_8_dll" KeyPath="yes" Source="C:\msys64\usr\bin\msys-intl-8.dll"/> </Component> <Component Bitness="always64" Id="msys_glib_2_0_0_dll"> <File Id="msys_glib_2_0_0_dll" KeyPath="yes" Source="C:\msys64\usr\bin\msys-glib-2.0-0.dll"/> </Component> <Component Bitness="always64" Id="msys_stdc_6_dll"> <File Id="msys_stdc_6_dll" KeyPath="yes" Source="C:\msys64\usr\bin\msys-stdc++-6.dll"/> </Component> <Component Bitness="always64" Id="msys_iconv_2_dll"> <File Id="msys_iconv_2_dll" KeyPath="yes" Source="C:\msys64\usr\bin\msys-iconv-2.dll"/> </Component> <Component Bitness="always64" Id="msys_gcc_s_seh_1_dll"> <File Id="msys_gcc_s_seh_1_dll" KeyPath="yes" Source="C:\msys64\usr\bin\msys-gcc_s-seh-1.dll"/> </Component> <Component Bitness="always64" Id="msys_2_0_dll"> <File Id="msys_2_0_dll" KeyPath="yes" Source="C:\msys64\usr\bin\msys-2.0.dll"/> </Component> <Component Bitness="always64" Id="msys_pcre2_8_0_dll"> <File Id="msys_pcre2_8_0_dll" KeyPath="yes" Source="C:\msys64\usr\bin\msys-pcre2-8-0.dll"/> </Component> <Component Bitness="always64" Id="msys_slirp_0_dll"> <File Id="msys_slirp_0_dll" KeyPath="yes" Source="C:\msys64\usr\local\bin\msys-slirp-0.dll"/> </Component> </Directory> </StandardDirectory> <Feature Id="reSLIRPFeature"> <ComponentRef Id="ProductComponent"/> <ComponentRef Id="msys_intl_8_dll"/> <ComponentRef Id="msys_glib_2_0_0_dll"/> <ComponentRef Id="msys_stdc_6_dll"/> <ComponentRef Id="msys_iconv_2_dll"/> <ComponentRef Id="msys_gcc_s_seh_1_dll"/> <ComponentRef Id="msys_2_0_dll"/> <ComponentRef Id="msys_pcre2_8_0_dll"/> <ComponentRef Id="msys_slirp_0_dll"/> </Feature> </Package> </Wix>
程序架构验证
项目通过msys2编译,生成的可执行文件为x86_64架构:
$ file /c/Program\ Files\ \(x86\)/reSLIRP/reslirp.exe /c/Program Files (x86)/reSLIRP/reslirp.exe: PE32+ executable for MS Windows 5.02 (console), x86-64, 18 sections
解决方案
问题核心是Package元素未指定64位属性。你仅给Component设置了Bitness="always64",但WIX v4中,整个安装包的位数由Package的Bitness属性决定。如果Package未明确指定64位,Windows Installer会默认按32位处理,此时ProgramFiles64Folder会被重定向到C:\Program Files (x86)。
修改步骤:
在Package标签中添加Bitness="always64"属性,修改后的Package标签如下:
<Package Compressed="yes" InstallerVersion="500" Manufacturer="HappyRobotsLTD" Name="reSLIRP" Scope="perMachine" UpgradeCode="12345678-ABCD-0001-0001-250131143054" Version="1.1.0.0" Bitness="always64">
重新编译生成MSI后,程序就会被正确安装到C:\Program Files目录。
内容的提问来源于stack exchange,提问作者salva
相关产品推荐
相关产品推荐

