如何让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
相关产品推荐
相关产品推荐

