MSBuildWorkspace的OpenProjectAsync方法打开的项目中存在空文档。

6

我通过dotnet new console创建了一个简单的控制台应用程序。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

</Project>

然后我在另一个应用程序中编写了一段代码,通过Roslyn获取编译结果。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="CommandLineParser" Version="2.8.0" />
    <PackageReference Include="McMaster.Extensions.CommandLineUtils" Version="3.0.0" />
    <PackageReference Include="Microsoft.CodeAnalysis.Workspaces.Common" Version="3.6.0-4.final" />
    <PackageReference Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="3.6.0-4.final" />
    <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="3.6.0-4.final" />
    <PackageReference Include="Microsoft.Build" Version="16.5.0" />
    <PackageReference Include="PowerArgs" Version="3.6.0" />
  </ItemGroup>

</Project>

var workspace = MSBuildWorkspace.Create();
workspace.LoadMetadataForReferencedProjects = true;
var project = workspace.OpenProjectAsync(@"C:\...\Desktop\sample\sample.csproj").Result;
var compilation = project.GetCompilationAsync().Result;

但是文件长度为0,所以我编写了另一个代码块来找出问题所在。
var diagnostics = workspace.Diagnostics;
foreach (var diagnostic in diagnostics)
{
    Console.WriteLine(diagnostic.Message);
}

错误信息是(VS):
Msbuild failed when processing the file 'C:\...\Desktop\sample\sample.csproj' with message: The SDK 'Microsoft.NET.Sdk' specified could not be found.  C:\...\Desktop\sample\sample.csproj

还有在 Rider 中:

Msbuild failed when processing the file 'C:\...\Desktop\sample\sample.csproj' with message: MSB0001: Internal MSBuild Error: Type information for Microsoft.Build.Utilities.ToolLocationHelper was present in the whitelist cache as Microsoft.Build.Utilities.ToolLocationHelper, Microsoft.Build.Utilities.Core, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a but the type could not be loaded. unexpectedly null

我的.NET Core信息:

.NET Core SDK (reflecting any global.json):
 Version:   3.1.201
 Commit:    b1768b4ae7

Runtime Environment:
 OS Name:     Windows
 OS Version:  10.0.18362
 OS Platform: Windows
 RID:         win10-x64
 Base Path:   C:\Program Files\dotnet\sdk\3.1.201\

Host (useful for support):
  Version: 3.1.3
  Commit:  4a9f85e9f8

.NET Core SDKs installed:
  3.1.101 [C:\Program Files\dotnet\sdk]
  3.1.102 [C:\Program Files\dotnet\sdk]
  3.1.201 [C:\Program Files\dotnet\sdk]

.NET Core runtimes installed:
  Microsoft.AspNetCore.All 2.1.15 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.App 2.1.15 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 3.1.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 3.1.2 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 3.1.3 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 2.1.15 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 3.1.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 3.1.2 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 3.1.3 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.WindowsDesktop.App 3.1.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 3.1.2 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 3.1.3 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

我该怎么做才能获得结果?


你找到解决方案了吗? - Jaap
2
是的,请查看以下链接 https://github.com/dotnet/roslyn/issues/44586 https://github.com/HamedFathi/LoadSolutionForAnalysis - HamedFathi
1个回答

3
我最近遇到了这个错误。
为了让它工作,我必须确保我有: 然后在我的代码中,我可以写
MSBuildLocator.RegisterDefaults(); // Register location of .NET SDK

var workspace = MSBuildWorkspace.Create();
var project = await workspace.OpenProjectAsync(@"C:\project.csproj").ConfigureAwait(false);
var compilation = await project.GetCompilationAsync().ConfigureAwait(false);

值得注意的是,当前存在一个问题(https://github.com/microsoft/MSBuildLocator/issues/179),与Microsoft.Build.Locator 1.5.3有关,这会产生相同的错误消息,因此在提供修复之前,请使用1.4.1版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接