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

如何让NuGet包中的原生DLL复制到引用项目的构建输出?

解决NuGet包中原生DLL未复制到引用项目输出目录的问题

问题根源

你之前用的<CopyToOutputDirectory>仅对当前Foo项目自身的构建输出生效,当Foo被打包为NuGet包、被Bar项目引用时,这个配置不会传递到Bar的构建流程里,所以原生DLL无法自动复制到Bar的输出目录。

解决方案:借助MSBuild目标文件(.targets)

NuGet会自动将包内build目录下的.targets文件导入到引用项目的构建过程中,我们可以通过这个机制实现原生DLL的自动复制:

步骤1:创建MSBuild目标文件

在Foo项目根目录下新建build/Foo.targets文件,写入以下内容:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- 定位原生DLL的路径 -->
  <ItemGroup>
    <FooNativeDll Include="$(MSBuildThisFileDirectory)x64\FooNative.dll" />
  </ItemGroup>

  <!-- 在引用项目构建完成后执行复制操作 -->
  <Target Name="CopyFooNativeToOutput" AfterTargets="Build">
    <Copy
      SourceFiles="@(FooNativeDll)"
      DestinationFolder="$(OutputPath)"
      SkipUnchangedFiles="true"
    />
  </Target>
</Project>

步骤2:修改Foo.csproj,确保文件被正确打包

更新Foo.csproj中的<ItemGroup>节点,添加.targets文件的打包配置,同时确认原生DLL的打包路径正确:

<!-- 打包原生DLL和目标文件到对应目录 -->
<ItemGroup>
  <Content Include="ThirdParty/FooNative.dll">
    <Pack>true</Pack>
    <PackagePath>build/x64</PackagePath>
  </Content>
  <Content Include="build/Foo.targets">
    <Pack>true</Pack>
    <PackagePath>build</PackagePath>
  </Content>
  <!-- 托管DLL的打包配置保持不变 -->
  <Content Include="ThirdParty/FooManaged.dll">
    <Pack>true</Pack>
    <PackagePath>lib/netstandard2.0</PackagePath>
  </Content>
</ItemGroup>

步骤3:重新打包并验证

执行dotnet pack重新生成Foo的NuGet包,更新Bar项目对Foo包的引用后重新构建,此时Bar的输出目录应该会包含FooNative.dll。

扩展说明

如果原生DLL有多平台版本(如x86、x64),可以在.targets中根据引用项目的平台条件复制对应版本:

<ItemGroup Condition="'$(Platform)' == 'x64'">
  <FooNativeDll Include="$(MSBuildThisFileDirectory)x64\FooNative.dll" />
</ItemGroup>
<ItemGroup Condition="'$(Platform)' == 'x86'">
  <FooNativeDll Include="$(MSBuildThisFileDirectory)x86\FooNative.dll" />
</ItemGroup>

同时要确保Bar项目的平台设置(如x64)与原生DLL的平台匹配,避免兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 09:40:38