如何将dll作为content添加到Nuget包并自动复制到项目输出目录
错误根因
你遇到的报错是因为NuGet的contentFiles默认针对文本类静态内容做校验,直接将二进制dll放入contentFiles目录会触发非法内容拦截。
解决方案
以下两种方案均可实现需求,可根据你的项目兼容场景选择:
方案1:通过自动导入的Build目标文件实现(兼容性最优)
该方案兼容SDK格式和传统.NET Framework非SDK格式的引用项目,是官方推荐的实现方式:
- 在打包项目根目录新建和你的NuGet包ID同名的.targets文件,假设你的包ID为
My.Custom.Package,则文件名为My.Custom.Package.targets,内容如下:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <!-- 从NuGet包内的MyDlls目录读取所有文件,设置自动复制到输出目录 --> <None Include="$(MSBuildThisFileDirectory)..\MyDlls\*.*"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <Link>%(Filename)%(Extension)</Link> </None> </ItemGroup> </Project>
- 修改你的nuspec配置,删除原contentFiles相关配置,更新文件映射逻辑:
</metadata> <files> <file src="buildresults\netstandard2.0\*.dll" target="lib\netstandard2.0" /> <!-- 将net462的dll打包到NuGet包内的MyDlls目录 --> <file src="buildresults\net462\*.*" target="MyDlls" /> <!-- 将targets文件打包到NuGet包的build目录,NuGet会自动将其导入引用项目 --> <file src="你本地存放targets文件的路径\My.Custom.Package.targets" target="build\My.Custom.Package.targets" /> </files> </package>
方案2:contentFiles加二进制属性声明(仅兼容SDK格式项目)
如果你的引用项目都是SDK格式的.NET Core/.NET 5+项目,可以直接修改现有配置,为二进制文件指定contentType绕过校验:
<contentFiles> <files include="contentFiles\any\any\MyDlls\*.*" buildAction="None" copyToOutput="true" /> </contentFiles> </metadata> <files> <file src="buildresults\netstandard2.0\*.dll" target="lib\netstandard2.0" /> <!-- 新增contentType属性声明为二进制流,绕过文本校验 --> <file src="buildresults\net462\*.*" target="contentFiles\any\any\MyDlls" contentType="application/octet-stream" /> </files> </package>
内容的提问来源于stack exchange,提问作者user1472131
相关产品推荐
相关产品推荐

