如何在C#项目的NuGet包中正确引用并包含C++ DLL文件
解决方案
你遇到的报错和DLL未打包问题来自两个配置错误:一是非托管C++ DLL不能放在lib/native路径下,会触发NuGet目标框架校验;二是默认ProjectReference配置不会自动把VC++项目输出纳入NuGet打包清单。按以下步骤配置即可:
1. 优先使用csproj内置打包配置(推荐,无需手动维护nuspec)
修改C#项目中对C++ vcxproj的引用配置,替换为如下内容:
<ProjectReference Include="..\Hashing\Com.BaseName.Hashing.vcxproj"> <Project>{028E03CD-5DAE-40FF-AAEF-4DF471D0076F}</Project> <Name>Com.BaseName.Hashing</Name> <ReferenceOutputAssembly>false</ReferenceOutputAssembly> <OutputItemType>None</OutputItemType> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <Private>true</Private> <!-- 打包核心配置 --> <Pack>true</Pack> <!-- 按你需要支持的架构填写RID,不需要的架构直接删除对应路径 --> <PackagePath>runtimes\win-x64\native;runtimes\win-x86\native</PackagePath> </ProjectReference>
注意:非托管DLL必须放在
runtimes/[RID]/native路径下,.NET运行时会自动根据当前运行环境加载对应架构的原生库,不要放到lib目录下。
同解决方案下的其他C#托管项目引用,不需要额外配置,SDK风格项目会自动把托管DLL打入lib/netcoreapp3.1路径。
2. 如果你必须保留自定义nuspec文件
做三处修改即可解决报错并正确打包:
- 在
<dependencies>节点下新增原生依赖组,解决native0.0校验报错:
<dependencies> <group targetFramework="netcoreapp3.1"></group> <!-- 新增下面这行 --> <group targetFramework="native0.0" /> </dependencies>
- 删除原来错误的
lib\native路径配置,把C++ DLL的打包路径改为对应RID的native目录:
<!-- 替换原来的lib\native配置,按实际架构调整路径 --> <file src="Com.BaseName.Hashing.dll" target="runtimes\win-x64\native" />
- 确保C++ DLL的src路径填写正确,建议写相对输出目录的完整路径,避免打包时找不到文件。
3. 验证与排查
- 打包完成后用压缩软件打开nupkg文件,确认对应runtimes路径下存在C++生成的DLL即可
- 如果生成时找不到C++ DLL,检查C#和C项目的目标平台是否一致:例如C#项目生成配置为Any CPU时,不会自动复制x64/x86专属的C输出,建议C#项目绑定固定目标平台(x86/x64)
- 如果包安装后运行提示找不到DLL,检查C++项目是否配置为动态库编译,若依赖VC运行时建议开启静态链接,或把VC运行时DLL一并打入native目录
内容的提问来源于stack exchange,提问作者Ahmad
相关产品推荐
相关产品推荐

