Visual Studio 2017创建ASP.NET Core项目遇依赖缺失及版本冲突问题
问题背景
我使用Visual Studio 2017创建新的ASP.NET Core应用程序,但生成的项目因依赖缺失无法编译。按照其他用户建议执行
dotnet restore后,项目可编译运行,但出现大量版本冲突,例如:
1> 检测到‘Reference:C:\Program Files\dotnet\sdk\NuGetFallbackFolder\microsoft.netcore.app\2.0.0\ref\netcoreapp2.0\System.AppContext.dll’与‘Reference:C:\Program Files\dotnet\sdk\NuGetFallbackFolder\system.appcontext\4.3.0\ref\netstandard1.6\System.AppContext.dll’之间存在冲突。选择‘Reference:C:\Program Files\dotnet\sdk\NuGetFallbackFolder\microsoft.netcore.app\2.0.0\ref\netcoreapp2.0\System.AppContext.dll’,因为其AssemblyVersion‘4.2.0.0’高于‘4.1.0.0’。
(其余冲突示例略)
问题1:创建新ASP.NET Core项目后立即执行dotnet restore是否正常?若不正常,原因是什么?
正常来说,Visual Studio 2017在创建ASP.NET Core项目时会自动触发NuGet包恢复流程,完全不需要手动运行dotnet restore命令。
你遇到需要手动执行的异常情况,核心原因是Visual Studio的「自动恢复缺失包」功能未启用:
- 当这个功能关闭时,VS不会自动下载、还原项目所需的依赖包,刚创建的项目自然会因为依赖缺失无法编译;
- 手动执行
dotnet restore虽然能临时补上缺失的依赖,但命令行的包恢复不会像VS那样根据项目目标框架(这里是.NET Core 2.0)自动协调版本兼容性,所以就会出现大量组件版本冲突的提示。
问题2:如何消除这些版本冲突?
针对你的场景,最彻底的解决方式是让Visual Studio重新接管依赖管理,步骤如下:
- 打开Visual Studio 2017,依次点击 工具 > NuGet包管理器 > 包管理器设置;
- 在设置窗口中,选择 NuGet包管理器 > 常规;
- 勾选 允许NuGet下载缺失的包 和 在构建期间自动检查缺失的包 这两个选项;
- 点击「确定」后,右键你的项目选择 清理解决方案,再重新执行构建。
这样VS会自动根据项目的目标框架版本,拉取并协调所有依赖的兼容版本,从根源上避免手动dotnet restore带来的版本不一致问题。如果之前已经手动执行过dotnet restore,建议先删除项目目录下的obj和bin文件夹,再重新构建,确保所有依赖都是VS自动恢复的版本。
更新补充
后续发现是「恢复缺失包」选项未启用,启用后无需执行dotnet restore即可成功构建项目,且不会出现版本冲突问题。
内容的提问来源于stack exchange,提问作者Ben Rubin

