PAYATHON 2026

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,依次检查:

  1. 将 Visual Studio 2017 更新到最新可用的 15.9 服务版本。
  2. 选择“修改”。
  3. 确认已勾选“ASP.NET 和 Web 开发”工作负载。
  4. 在“单个组件”中检查 .NET Core SDK、Web 开发工具和相关目标包是否已安装。
  5. 应用修改并重新启动 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 还原完成。如果问题仍然存在,可以继续检查:

  1. 在 Visual Studio Installer 中对 Visual Studio 2017 执行“修复”。
  2. 查看“输出”窗口中的“项目系统”和“NuGet”信息。
  3. 卸载并重新加载项目,观察是否出现更具体的错误。
  4. 确认解决方案不是从网络共享目录、受控文件夹或没有写入权限的目录打开。
  5. 暂时禁用可能影响项目加载的第三方扩展,然后重新测试。

如果删除 .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 集成,再根据实际错误处理。

备注:内容仅供参考。