MSB4242:SDK 解析程序“Microsoft.DotNet.MSBuildSdkResolver”无法运行。路径中存在非法字符

ron*_*ney 2 .net c# msbuild visual-studio .net-core

无法从命令提示符构建我的 Visual Studio 项目。(Visual Studio 2019,.NET Core)

sourceanalyzer%MEMORY_TRANSLATION% -b %BUILDID% -logfile %LOGFILE_TRANSLATION% msbuild myChatBot.sln /t:Rebuild/p:Configuration=Debug/p:Platform="any cpu"

我们正在尝试使用 HP Fortify 脚本/bat 文件对我的代码运行 fortify 扫描,上面的代码行是从 Visual Studio 2019 命令提示符构建 sln。获取如下粘贴的错误消息

C:\Users....\myprojVA.csproj :警告 MSB4242:SDK 解析器“Microsoft.DotNet.MSBuildSdkResolver”无法运行。路径中存在非法字符。项目“C:\Users....\myprojVA.sln”(1) 正在节点 1 上构建“C:\Users....\myprojVA.csproj”(2)(重建目标)。C:\Users....\myprojVA.csproj:错误 MSB4236:找不到指定的 SDK“Microsoft.NET.Sdk.Web”。完成构建项目“C:\Users....\myprojVA.csproj”(重建目标)——失败。C:\Users....\myprojVA.csproj :警告 MSB4242:SDK 解析器“Microsoft.DotNet.MSBuildSdkResolver”无法运行。路径中存在非法字符。项目“C:\Users....\myprojVA.sln”(1) 正在节点 1 上构建“C:\Users....\myprojVA.Tests.csproj”(3)(重建目标)。C:\Users....\myprojVA.Tests.csproj:错误 MSB4236:找不到指定的 SDK“Microsoft.NET.Sdk”。完成构建项目“C:\Users....\myprojVA.Tests.csproj”(重建目标)——失败。完成构建项目“C:\Users....\myprojVA.sln”(重建目标)——失败。

构建失败。

C:\Users....\myprojVA.csproj :警告 MSB4242:SDK 解析器“Microsoft.DotNet.MSBuildSdkResolver”无法运行。路径中存在非法字符。

C:\Users....\myprojVA.Tests.csproj :警告 MSB4242:SDK 解析器“Microsoft.DotNet.MSBuildSdkResolver”无法运行。路径中存在非法字符。

关于为什么 SDK 解析器“Microsoft.DotNet.MSBuildSdkResolver”无法运行有什么想法吗?我怎样才能解决这个问题 ?

Zé *_*los 5

微软已将 msbuild 工具的代码开源。看看这里DefaultSdkResolver 的实现。

您可以看到消息“路径中的非法字符”所指的路径是通过以下方式创建的:

var sdkPath = Path.Combine(BuildEnvironmentHelper.Instance.MSBuildSDKsPath, sdk.Name, "Sdk");
Run Code Online (Sandbox Code Playgroud)

首先确保您至少安装了一个版本的“.NET Core SDK”。如果这样做,并且使用默认安装文件夹,则该文件夹中应该有一些内容:C:\Program Files\dotnet\sdk\3.1.101\Sdks(将 3.1.101 调整为您拥有的版本)

该文件夹将是方法 Path.Combine 的第一个参数。我不明白为什么 msbuild 不在默认安装位置中查找它,但似乎您必须设置一个系统变量来告诉 msbuild 您的 SDK 在哪里。

变量名称: MSBuildSDKsPath 变量值: C:\Program Files\dotnet\sdk\3.1.101\Sdks\

此变量将用于提供 BuildEnvironmentHelper.Instance.MSBuildSDKsPath 的值

非常重要:不要在变量值中使用引号并以“\”结束,因为正如您在源代码中看到的那样,该值将与其余路径部分连接起来。

这应该足以让您编译代码。如果还有更多问题,请尝试将详细级别设置为诊断并检查日志开头的变量值。(调用msbuild时添加参数-v diag )