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

如何让Visual Studio C#项目将本地.so库复制到构建目录

解决.NET7 NuGet库中.so文件未被消费项目复制的问题

问题分析

你当前用Content节点打包.so文件到NuGet的contentFiles/any/any目录,但消费项目构建、发布时未复制这些文件,核心原因是Content节点并非.NET原生库的最优打包方式,NuGet对原生资产的处理逻辑更倾向于专门的NativeAsset节点,且contentFiles的复制规则需要额外配置才能生效。

解决方案

1. 修改库项目的原生文件打包配置

将原有的Content节点替换为NativeAsset,指定符合.NET运行时目录规范的PackagePath:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <RuntimeIdentifier>linux-x64</RuntimeIdentifier>
    <PackageId>my.library.name</PackageId>
    <Title>My Library</Title>
    <Authors>Me</Authors>
    <Company>My Company</Company>
    <Product>The Library</Product>
  </PropertyGroup>

  <ItemGroup>
    <!-- 用NativeAsset替代Content,专门处理原生库文件 -->
    <NativeAsset Include="../res/liblib1.so" Pack="true" PackagePath="runtimes/linux-x64/native">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </NativeAsset>
    <NativeAsset Include="../res/liblib2.so" Pack="true" PackagePath="runtimes/linux-x64/native">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </NativeAsset>
  </ItemGroup>

</Project>

2. 配置消费项目确保发布时包含原生资产

在消费项目的.csproj中添加以下属性,确保发布流程会包含NuGet包中的原生文件:

<PropertyGroup>
  <!-- 发布时自动包含NuGet原生资产 -->
  <PublishNativeAssets>true</PublishNativeAssets>
</PropertyGroup>

3. 验证与测试

  • 重新打包NuGet库,解压后可看到文件位于runtimes/linux-x64/native目录下
  • 消费项目构建后,.so文件会出现在输出目录的runtimes/linux-x64/native路径中
  • 发布消费项目时,这些文件会被同步复制到发布目录的对应路径,P/Invoke会自动搜索该路径加载原生库

备选方案(直接输出到根目录)

如果需要.so文件直接放在可执行文件同目录,可保留Content节点但补充配置:

<ItemGroup>
  <Content Include="../res/liblib1.so" Pack="true" PackagePath="contentFiles/any/any">
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    <PackageCopyToOutput>true</PackageCopyToOutput>
    <!-- 指定兼容目标框架,确保消费项目能识别 -->
    <ContentTargetFallback>$(ContentTargetFallback);net7.0</ContentTargetFallback>
  </Content>
  <Content Include="../res/liblib2.so" Pack="true" PackagePath="contentFiles/any/any">
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    <PackageCopyToOutput>true</PackageCopyToOutput>
    <ContentTargetFallback>$(ContentTargetFallback);net7.0</ContentTargetFallback>
  </Content>
</ItemGroup>

同时在消费项目中启用内容文件支持:

<PropertyGroup>
  <EnableContentFiles>true</EnableContentFiles>
</PropertyGroup>

内容的提问来源于stack exchange,提问作者jdunlop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 13:57:28