为何NuGet包依赖的runtimes目录在.NET Core+输出,.NET Framework中缺失
问题根因
- 你的
.nuspec配置中,对OpenCvSharp4和OpenCvSharp4.runtime.win两个依赖都设置了exclude="Build,Analyzers"属性。OpenCvSharp原生库的复制逻辑完全依赖自身包内的build目标文件实现,你排除了Build部分后,这些复制逻辑不会传递到引用你包的项目中。 - .NET Core/.NET 5+ 本身原生支持NuGet运行时RID资产的自动识别和复制,就算排除了Build目标,也会自动将
runtimes目录下的原生资产复制到输出目录;但.NET Framework没有这套原生逻辑,完全依赖NuGet包自带的build目标完成原生dll的复制,因此就出现了runtimes目录缺失的问题。 - 你当前的
.nuspec没有单独针对.NET Framework的依赖组,.NET Framework项目引用你的包时会复用.NET Standard 2.0的依赖配置,自然继承了exclude属性,所以触发了该问题。
修复方案
- 方案1:移除
OpenCvSharp4和OpenCvSharp4.runtime.win依赖上的exclude="Build,Analyzers"属性,让OpenCvSharp自带的build目标可以正常传递到引用你包的项目中,.NET Framework项目就能自动完成runtimes目录的复制。 - 方案2:如果你确实需要排除这两个包的代码分析器,可以将exclude属性调整为仅排除Analyzers,即修改为
exclude="Analyzers",保留Build部分的导入即可。 - 方案3:如果有特殊需求必须排除Build部分,你可以在自己的NuGet包中新增针对.NET Framework的build目标,自行实现OpenCvSharp原生dll的复制逻辑,不过该方案成本较高,不推荐优先使用。
内容的提问来源于stack exchange,提问作者Anthony Simmon
相关产品推荐
相关产品推荐

