NuGet包安装仅添加x86 DLL引用,如何同时引入x86和x64版本?
解决自定义NuGet包同时添加x86和x64 DLL引用的问题
核心思路
不能直接在安装时同时添加两个架构的DLL引用(会导致冲突),正确的做法是通过NuGet的.targets文件配置条件性引用,让MSBuild在构建阶段根据项目的目标平台自动选择对应的DLL。
调整NuGet包结构
首先确保你的包结构符合以下规范:
YourPackage/ ├── build/ │ └── YourPackage.targets # 文件名必须和包名一致 ├── lib/ │ ├── x86/ │ │ └── YourLibrary.dll │ └── x64/ │ └── YourLibrary.dll
注意:不要将DLL直接放在lib根目录下,否则NuGet会自动引用根目录的DLL,忽略架构子目录的配置。
编写正确的.targets文件
替换你现有的.targets文件,使用以下内容(将YourPackage和YourLibrary替换为实际名称):
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <!-- 针对x86平台添加引用 --> <ItemGroup Condition="'$(PlatformTarget)' == 'x86'"> <Reference Include="YourLibrary"> <HintPath>$(MSBuildThisFileDirectory)..\lib\x86\YourLibrary.dll</HintPath> <Private>True</Private> </Reference> </ItemGroup> <!-- 针对x64平台添加引用 --> <ItemGroup Condition="'$(PlatformTarget)' == 'x64'"> <Reference Include="YourLibrary"> <HintPath>$(MSBuildThisFileDirectory)..\lib\x64\YourLibrary.dll</HintPath> <Private>True</Private> </Reference> </ItemGroup> </Project>
关键配置说明:
$(MSBuildThisFileDirectory):自动指向NuGet包中build文件夹的路径,确保能正确定位lib目录下的DLL。Condition:根据项目的PlatformTarget值触发对应架构的引用逻辑,避免同时加载两个DLL导致冲突。<Private>True</Private>:确保DLL会被复制到项目输出目录,随项目一起发布。
验证步骤
- 重新打包NuGet包,确认
build和lib目录结构完全符合要求。 - 在项目中卸载旧包,清理
bin/obj目录后,重新安装新包。 - 切换项目目标平台(右键项目→属性→生成→平台目标)为x86或x64,查看引用是否自动切换为对应架构的DLL。
- 构建项目,检查输出目录中是否只有当前平台的DLL文件。
常见问题排查
- 引用不生效:检查
.targets文件是否放在build目录下,且文件名与包名完全一致。 - 出现引用冲突:确保
lib根目录下没有同名DLL,避免NuGet自动添加默认引用覆盖条件引用。 - 输出目录无DLL:确认
<Private>True</Private>配置正确,或检查项目引用的“复制本地”属性是否为True。
内容的提问来源于stack exchange,提问作者Heber Ajbal
相关产品推荐
相关产品推荐

