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

.NET 8类库NuGet包外部文件未随包安装问题求助

解决NuGet包安装后原生DLL及文档文件不复制到项目的问题

问题根源

你当前将原生C DLL放在lib/$(TargetFramework)/LibLouis路径下,NuGet的lib目录仅用于托管.NET程序集,非托管文件不会被自动复制到引用项目的输出目录。文档文件虽已打包在docs目录,但默认不会同步到引用项目的文件结构中。

修复方案

1. 调整原生DLL的打包路径(核心修复)

将原生DLL移到NuGet标准的runtime/{RID}/native目录结构下,RID(运行时标识符)对应目标平台(比如win-x64)。修改csproj中的Content项:

<ItemGroup>
  <Content Include="LibLouis/**">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    <Pack>true</Pack>
    <Visible>false</Visible>
    <!-- 替换为runtime目录,适配x64 Windows平台 -->
    <PackagePath>runtime/win-x64/native/LibLouis/</PackagePath>
  </Content>
</ItemGroup>

这样MSBuild会自动识别原生库,编译引用项目时会将其复制到输出目录。如果需要支持多平台,可添加多个Content项对应不同RID(如linux-x64)。

2. 让文档文件在引用项目中可见(可选)

如果希望README.md和CHANGELOG.md安装后出现在引用项目中,修改None项为Content并添加复制规则:

<ItemGroup>
  <Content Include="../../README.md" Pack="true" Visible="false" PackagePath="/docs">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
  <Content Include="../../CHANGELOG.md" Pack="true" Visible="false" PackagePath="/docs">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>

若仅需保留在NuGet包中无需复制到项目,可保持原None配置,但这些文件仅存于NuGet缓存,不会出现在引用项目的文件结构里。

3. 验证修复

  • 重新执行dotnet pack生成新的NuGet包
  • 在测试项目中卸载旧包,重新安装新包
  • 编译测试项目后,检查输出目录(如bin/Release/net8.0),应该能看到LibLouis文件夹及其中的原生DLL

额外说明

  • 确保Platforms设置为x64与RID匹配,避免跨平台适配问题
  • 使用PackageReference格式(.NET默认)时,无需额外配置,MSBuild会自动处理runtime目录下的原生文件
  • 若仍有问题,可检查引用项目的obj/project.assets.json,确认原生文件已被正确包含在依赖项中

内容的提问来源于stack exchange,提问作者André Polykanine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 23:34:57