You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 17:30:46