如何在VS2017中强制.NET Framework 4.7.1使用NuGet包中的.NET Standard库
这个问题的根源在于NuGet的默认包解析逻辑:对于.NET Framework项目,它会优先选择专门针对.NET Framework编译的包版本(比如这里的net45),哪怕你的项目(.NET Framework 4.7.1)完全支持.NET Standard库。下面给你几个无需手动重新打包的可行方案:
方案1:通过项目文件配置Asset Target Fallback(推荐)
这个方法会告诉NuGet,当找不到适配当前项目框架的包时,优先尝试指定的.NET Standard框架版本,而不是默认的旧.NET Framework版本。
操作步骤:
- 在VS2017中右键点击项目B,选择编辑.csproj(如果是Web项目,可能需要先卸载项目再编辑)。
- 在
<PropertyGroup>节点中添加以下配置:<AssetTargetFallback>netstandard1.3;$(AssetTargetFallback)</AssetTargetFallback> - 保存文件,右键项目选择还原NuGet包。
这样NuGet就会优先选择RavenDB.Client的netstandard1.3版本,而不是net45版本,解决类型不兼容的问题。
方案2:直接在项目文件中强制指定包的目标框架
如果方案1不生效,你可以直接在项目的PackageReference中明确指定要使用的目标框架版本:
- 同样编辑项目B的.csproj文件,找到(或添加)RavenDB.Client的PackageReference节点,修改为:
<PackageReference Include="RavenDB.Client" Version="3.5.4"> <TargetFrameworks>netstandard1.3</TargetFrameworks> </PackageReference> - 保存后还原NuGet包即可。
注意:如果你的项目B目前使用的是
packages.config管理NuGet包,建议先迁移到PackageReference(右键项目→管理NuGet包→设置→默认包管理格式选择PackageReference),因为packages.config的框架定向能力有限。
方案3:调整NuGet的包解析优先级
你也可以在解决方案的NuGet.config文件中添加包优先级配置,确保.NET Standard版本被优先选择:
- 在解决方案根目录找到NuGet.config(如果没有就新建一个)。
- 添加以下配置:
<configuration> <config> <add key="dependencyVersion" value="Highest" /> </config> <packageSources> <!-- 保持原有的包源配置 --> </packageSources> <frameworks> <framework name="net471"> <dependencies> <dependency id="RavenDB.Client" version="3.5.4" target="netstandard1.3" /> </dependencies> </framework> </frameworks> </configuration> - 保存后还原所有NuGet包。
这个方法会针对net471框架明确指定RavenDB.Client的目标框架版本,强制NuGet选择netstandard1.3的包。
所有方案的核心都是修改NuGet的包解析逻辑,让它优先选择.NET Standard版本的包,利用.NET Framework 4.7.1对.NET Standard的良好兼容性来解决类型不兼容问题。
内容的提问来源于stack exchange,提问作者Guy Boicey

