自定义NuGet依赖的外部DLL引用后无法自动复制到输出目录,如何在csproj配置?
自定义NuGet包内嵌原生DLL自动复制到输出目录解决方案
你当前使用的<Content>配置仅会在你自己的打包项目生效,引用该NuGet包的项目默认不会继承这些DLL的CopyToOutputDirectory属性,因此需要额外配置打包规则实现自动复制。
方案1:配置contentFiles兼容SDK风格项目(推荐,适配.NET Core/.NET 5+项目)
直接修改你打包项目的csproj文件中对应DLL的配置,添加PackagePath元数据即可:
<Content Include="..\externalDlls\libnodave_jfkmod.dll"> <Pack>true</Pack> <PackagePath>contentFiles\any\any\;content\</PackagePath> <PackageCopyToOutput>true</PackageCopyToOutput> <CopyToOutputDirectory>Always</CopyToOutputDirectory> <!-- 若不想让DLL出现在引用方的项目树中,可添加下面一行 --> <!-- <Visible>false</Visible> --> </Content> <Content Include="..\externalDlls\libnodave_jfkmod64.dll"> <Pack>true</Pack> <PackagePath>contentFiles\any\any\;content\</PackagePath> <PackageCopyToOutput>true</PackageCopyToOutput> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content>
说明:contentFiles\any\any\路径表示该文件适用于任意目标框架、任意CPU架构的引用项目,打包后会被NuGet识别为内容文件自动继承复制属性。
方案2:添加.targets文件兼容全类型项目(适配所有.NET Framework/.NET Core项目)
如果需要兼容老旧的非SDK风格.NET Framework项目,可通过在NuGet包中嵌入生成目标实现强制复制:
- 在你的打包项目根目录新建
build文件夹,创建和你的NuGet包ID同名的.targets文件,例如包ID为MyCustomSiemensToolkit,则文件名为MyCustomSiemensToolkit.targets,内容如下:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <NativeLibs Include="$(MSBuildThisFileDirectory)..\contentFiles\any\any\*.dll" /> </ItemGroup> <Target Name="CopyNativeLibs" BeforeTargets="AfterBuild"> <Copy SourceFiles="@(NativeLibs)" DestinationFolder="$(OutputPath)" SkipUnchangedFiles="true" /> </Target> </Project>
- 在打包项目的csproj中添加配置,把这个.targets文件打包到包的对应目录:
<Content Include="build\*.targets"> <Pack>true</Pack> <PackagePath>build\</PackagePath> <Visible>false</Visible> </Content>
完成上述配置后重新打包,引用该包的项目编译时会自动将原生DLL复制到输出目录,无需手动修改属性。
内容的提问来源于stack exchange,提问作者Diego Erol
相关产品推荐
相关产品推荐

