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

.NET项目中如何将基础项目的原生DLL传递到消费项目?

解决原生DLL依赖传递到API项目的优雅方案

我之前处理过类似的.NET项目依赖传递问题,针对你提到的CpuMathNative.dll无法自动复制到API项目bin目录的情况,这里有几个不用手动添加文件或在API中引用NuGet包的优雅方案:

方案1:通过MSBuild显式复制原生DLL到输出目录

在Common项目的.csproj文件中添加以下配置,直接从NuGet包缓存中定位原生DLL并设置自动复制:

<ItemGroup>
  <!-- 匹配Microsoft.ML.CpuMath包中的所有平台原生DLL,可根据需求限定平台 -->
  <NativeLibrary Include="$(NuGetPackageRoot)microsoft.ml.cpumath\*\runtimes\**\CpuMathNative.dll">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    <Visible>false</Visible> <!-- 不在项目文件列表中显示 -->
  </NativeLibrary>
</ItemGroup>

原理说明:

  • $(NuGetPackageRoot)是MSBuild内置变量,自动指向本地NuGet包的缓存路径(通常是%UserProfile%\.nuget\packages)
  • *\runtimes\**会匹配该包的所有版本和所有平台的原生DLL,如果只需要特定平台(比如win-x64),可以修改为*\runtimes\win-x64\native\CpuMathNative.dll
  • 设置CopyToOutputDirectory为PreserveNewest,确保只有当原生DLL更新时才会复制,避免重复操作

方案2:用MSBuild目标强制传递原生依赖到引用项目

如果希望API项目能自动继承Common的原生依赖,可以在Common的.csproj中添加自定义MSBuild目标:

<Target Name="CopyAndTransmitNativeDependencies" AfterTargets="Build">
  <!-- 收集Microsoft.ML.CpuMath包中的原生DLL -->
  <ItemGroup>
    <CpuMathNativeFiles Include="$(NuGetPackageRoot)microsoft.ml.cpumath\*\runtimes\**\CpuMathNative.dll" />
  </ItemGroup>

  <!-- 复制到Common项目的输出目录 -->
  <Copy 
    SourceFiles="@(CpuMathNativeFiles)" 
    DestinationFiles="$(OutputPath)\%(RecursiveDir)%(Filename)%(Extension)"
    SkipUnchangedFiles="true"
  />

  <!-- 将这些文件标记为需要传递给引用项目(如API) -->
  <ItemGroup>
    <FileWrites Include="@(CpuMathNativeFiles)" />
  </ItemGroup>
</Target>

原理说明:

  • 这个目标会在Common构建完成后,将原生DLL复制到自身的输出目录
  • FileWrites是MSBuild的内置项,标记的文件会被传递给所有引用Common的项目,API项目在构建时会自动把这些文件复制到自己的bin目录

方案3:优化NuGet包引用的资产传递规则

检查Common项目中对Microsoft.ML.CpuMath的包引用配置,调整资产传递规则,确保原生DLL能被传递到API项目:

<PackageReference Include="Microsoft.ML.CpuMath" Version="你的版本号">
  <!-- 只隐藏编译时依赖,保留运行时资产(包括原生DLL)的传递 -->
  <PrivateAssets>compile;contentFiles</PrivateAssets>
  <IncludeAssets>runtime; build; native; contentFiles; analyzers; buildTransitive</IncludeAssets>
</PackageReference>

原理说明:

  • PrivateAssets控制哪些资产不会被传递给引用项目,这里设置compile和contentFiles不传递,避免API项目看到ML相关的编译依赖
  • IncludeAssets明确包含runtime和native资产,确保NuGet会把原生DLL传递到引用项目的输出目录

补充说明

你之前用的Dummy方法已经解决了托管DLL的复制问题(因为代码中引用了类型,MSBuild会认为该DLL是必要的),结合上面的任意一个方案,就能同时解决原生DLL的传递问题,完全不需要在API项目中添加任何额外的包或文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:27:25