Wix 3.14是否支持ARM64及ARM64自定义操作?构建异常求助
Wix 3.14 ARM64自定义动作DLL生成32位问题解决
先明确Wix 3.14的ARM64支持现状
Wix 3.14后期版本(如3.14.1及以后)确实支持ARM64格式MSI打包(所以Orca能识别为Arm64),但原生ARM64自定义动作(CA)的工具链支持不完善——默认的Wix.CA.targets未适配ARM64编译参数,且官方提供的Microsoft.Deployment.WindowsInstaller库可能没有ARM64版本,导致编译时自动回退到x86。
解决方法
方法1:强制ARM64编译参数+替换WiX CA依赖
- 补充ARM64项目配置,确保编译器明确指向ARM64目标:
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|ARM64'"> <!-- 保留原有配置 --> <OutputPath>$(OutDir)</OutputPath> <DefineConstants>TRACE;ARM64</DefineConstants> <Optimize>true</Optimize> <DebugType>pdbonly</DebugType> <PlatformTarget>ARM64</PlatformTarget> <LangVersion>7.3</LangVersion> <ErrorReport>prompt</ErrorReport> <Prefer32Bit>false</Prefer32Bit> <!-- 指定Roslyn编译器路径,确保支持ARM64编译 --> <CscToolPath>$(MSBuildProgramFiles32)\dotnet\sdk\$(DotNetSdkVersion)\Roslyn\bincore</CscToolPath> <CscToolExe>csc.dll</CscToolExe> </PropertyGroup>
- 替换
Microsoft.Deployment.WindowsInstaller引用:- 从WiX 4.x安装目录提取ARM64版本的
Microsoft.Deployment.WindowsInstaller.dll,或自行编译WiX 3.x的CA项目为ARM64架构。 - 将项目中的引用改为本地ARM64版本,确保
<Private>True</Private>配置保留。
- 从WiX 4.x安装目录提取ARM64版本的
方法2:修改Wix.CA.targets适配ARM64
找到WiX安装目录下的Wix.CA.targets(通常路径为C:\Program Files (x86)\Microsoft\WiX\v3.x\),添加ARM64平台支持:
<!-- 在文件开头添加ARM64平台配置 --> <PropertyGroup Condition="'$(Platform)' == 'ARM64'"> <WixCATargetPlatform>arm64</WixCATargetPlatform> <PlatformTarget>ARM64</PlatformTarget> <Prefer32Bit>false</Prefer32Bit> </PropertyGroup> <!-- 在编译目标中确保ARM64参数生效 --> <Target Name="BeforeBuild"> <PropertyGroup Condition="'$(Platform)' == 'ARM64'"> <DefineConstants>$(DefineConstants);ARM64</DefineConstants> </PropertyGroup> </Target>
方法3:临时兼容方案(依赖WOW64)
如果暂时无法获取ARM64版WiX CA库,可以用Any CPU编译配合禁用32位偏好:
- 将自定义动作项目的
PlatformTarget改为Any CPU,保留<Prefer32Bit>false</Prefer32Bit>。 - 在WiX MSI项目中,为ARM64平台添加
<DefineConstants>ARM64</DefineConstants>,并给自定义动作指定ARM64平台:
<CustomAction Id="MyCustomAction" BinaryKey="MyCADll" DllEntry="MyEntryPoint" Platform="arm64" />
注意:此方案依赖Windows WOW64层,可能存在兼容性风险,仅作临时过渡使用。
关键提示
candle.exe -v显示的架构是candle自身支持的编译目标(它本身是x86程序),不代表自定义动作的编译架构,无需为此纠结。
内容的提问来源于stack exchange,提问作者Joseph Willcoxson
相关产品推荐
相关产品推荐

