Windows 更新后 Visual Studio 2017 无法识别 ASP.NET Core 2.2 SDK
结论
磁盘上存在 ASP.NET Core 2.2 SDK 文件,不代表 Visual Studio 2017 一定能正常使用。还需要确认以下几项:
- Visual Studio 2017 已更新到最新的 15.9 服务版本。
- 已安装“ASP.NET 和 Web 开发”工作负载。
- 安装的是兼容 Visual Studio 2017 的 .NET Core 2.2 SDK,而非只有 Runtime。
global.json没有将项目固定到不存在或不兼容的 SDK。- NuGet 依赖能够正常还原,项目也能通过命令行加载和编译。
可以先在项目目录运行 dotnet --info 和 dotnet build。如果命令行也报错,应检查 SDK、项目配置和依赖还原。如果命令行编译成功,只有编辑器无法识别代码,则应检查 Visual Studio 的版本、工作负载和缓存。
ASP.NET Core 2.2 与 Visual Studio 2017 均已停止支持。维护旧项目时,可以按以下步骤恢复环境。仍在持续开发的项目应尽快迁移到受支持的 .NET 版本和新版 Visual Studio。
确认安装的是 SDK
打开“命令提示符”或 PowerShell,执行:
dotnet --list-sdks
dotnet --list-runtimes
dotnet --info
dotnet --list-sdks 的输出中应包含 2.2.x,例如:
2.2.1xx [C:\Program Files\dotnet\sdk]
补丁号取决于实际安装包,不要直接照搬示例。如果 2.2 只出现在 dotnet --list-runtimes 的输出中,而 dotnet --list-sdks 中没有,说明当前安装的是 Runtime 或 Hosting Bundle,无法用于项目开发和编译,还需要安装 SDK。
还可以检查系统实际调用的 dotnet.exe:
where.exe dotnet
常见位置包括:
C:\Program Files\dotnet\dotnet.exe
C:\Program Files (x86)\dotnet\dotnet.exe
如果输出指向其他目录,可能是旧版本安装或 PATH 顺序影响了 SDK 选择。此时应使用正式安装程序重新安装或修复,不要手动复制 SDK 文件。
安装完成后,彻底退出并重新启动 Visual Studio。必要时注销 Windows 或重启系统,使环境变量和安装信息重新加载。
更新 Visual Studio 2017 并补齐工作负载
打开 Visual Studio Installer,找到 Visual Studio 2017,依次检查:
- 将 Visual Studio 2017 更新到最新可用的 15.9 服务版本。
- 选择“修改”。
- 确认已勾选“ASP.NET 和 Web 开发”工作负载。
- 在“单个组件”中检查 .NET Core SDK、Web 开发工具和相关目标包是否已安装。
- 应用修改并重新启动 Visual Studio。
.NET Core 2.2 有多个 SDK 功能带,并非所有后期发布的 2.2 SDK 都能由 Visual Studio 2017 加载。维护旧环境时,应选用明确兼容 Visual Studio 2017 15.9 的 2.2 SDK。如果 SDK 已安装,但 Visual Studio 提示它需要更高版本的 MSBuild 或 Visual Studio,请改装兼容的 2.2 SDK,或者升级 Visual Studio。继续修改项目代码无法解决这类版本兼容问题。
检查 global.json
在解决方案目录及其父目录中查找 global.json。SDK 会沿目录逐级向上查找该文件,因此它未必位于项目旁边。
例如:
{
"sdk": {
"version": "2.2.100"
}
}
在 global.json 所在目录运行:
dotnet --version
dotnet --list-sdks
如果 global.json 指定的版本不在 SDK 列表中,项目将无法加载。可以安装它要求的准确版本,也可以在确认项目兼容后,将版本改为当前已安装且适用于 Visual Studio 2017 的版本。
旧版 SDK 与新版 SDK 的版本回退规则不完全相同。安装任意一个 2.2.x,未必能满足项目固定的版本要求。
如果项目不需要锁定 SDK,可以先备份并移走 global.json 进行验证。修改前要确认团队或构建服务器是否依靠该文件保持版本一致。
检查项目文件
ASP.NET Core 2.2 Web 项目的 .csproj 通常使用 Web SDK,目标框架为 netcoreapp2.2:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>
</Project>
检查以下内容:
Sdk是否缺失或拼写错误。TargetFramework是否为项目实际需要的目标框架。- 项目中是否残留已不存在的本地路径。
- 是否引用了无法还原的私有 NuGet 包。
Directory.Build.props或Directory.Build.targets是否覆盖了 SDK、框架或依赖配置。
不要为了消除编辑器中的红线而随意添加 ASP.NET Core 程序集引用。SDK 风格项目所需的框架引用和编译资产,通常由 SDK 与 NuGet 还原过程提供。
用命令行区分 SDK 问题和 Visual Studio 问题
进入包含 .csproj 的目录,执行:
dotnet restore
dotnet build
也可以明确指定项目:
dotnet restore .\YourProject.csproj
dotnet build .\YourProject.csproj
根据执行结果继续排查:
- 提示找不到兼容 SDK时,检查
global.json、SDK 版本和PATH。 - 提示无法识别
netcoreapp2.2时,确认 2.2 SDK 是否出现在dotnet --list-sdks的输出中。 - 提示包不存在或无法访问源时,检查 NuGet 配置、网络、私有源凭据和包版本。
- 命令行编译成功,而 Visual Studio 仍有大量代码标红时,问题更可能出在 Visual Studio 组件、项目系统或缓存上。
相比“SDK 已经安装”,具体错误信息更有助于定位问题。请保留 dotnet build 输出中的第一条实际错误,后续错误可能只是由它引起的连锁反应。
命令行成功但编辑器仍无法识别代码
关闭 Visual Studio,删除解决方案目录下的 .vs 文件夹。该文件夹保存 Visual Studio 的本地缓存,删除后会自动重建,不会影响项目源代码。
重新打开解决方案,等待 NuGet 还原完成。如果问题仍然存在,可以继续检查:
- 在 Visual Studio Installer 中对 Visual Studio 2017 执行“修复”。
- 查看“输出”窗口中的“项目系统”和“NuGet”信息。
- 卸载并重新加载项目,观察是否出现更具体的错误。
- 确认解决方案不是从网络共享目录、受控文件夹或没有写入权限的目录打开。
- 暂时禁用可能影响项目加载的第三方扩展,然后重新测试。
如果删除 .vs 后没有改善,无需反复清理缓存。应根据命令行输出,继续检查 Visual Studio 安装组件和项目文件。
如何确认配置已经恢复
运行以下命令进行验证:
dotnet --version
dotnet --list-sdks
dotnet restore
dotnet build
配置恢复后应符合以下情况:
dotnet --list-sdks中能看到项目需要的 2.2 SDK。- 在项目目录执行
dotnet --version,返回的版本符合global.json的要求。 dotnet restore能正常完成。dotnet build不再报告 SDK 或目标框架缺失。- Visual Studio 能正常加载项目,解决方案资源管理器中没有“项目不兼容”提示。
- ASP.NET Core 类型可以跳转到定义,代码补全和编译均恢复正常。
当前没有具体的错误文本,因此还无法判断原因是 SDK 版本、工作负载、NuGet 还原还是项目缓存。按上述顺序检查,可以先确认问题位于命令行环境还是 Visual Studio 集成,再根据实际错误处理。
备注:内容仅供参考。
