Roslyn 工作区 API 无法为第三方解决方案正确加载

问题描述 投票:0回答:1

我正在尝试使用已提供给我的第三方解决方案的 Roslyn Workspace API 枚举每个

Document
实例中的所有
Project
项目。我的代码如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.MSBuild;


string slnPath = "ThirdPartySolution.sln";

MSBuildWorkspace workspace = MSBuildWorkspace.Create();
Solution s = await workspace.OpenSolutionAsync("ThirdPartySolution.sln")
);

foreach (Project p in s.Projects)
{
    Console.WriteLine(p.Name);
    Console.WriteLine(p.Documents.Count());
        
    foreach (Document d in p.Documents)
    {
        Console.WriteLine("\t" + d.Name);
    }
}

workspace.Dispose();

当我使用 .NET Core 构建和运行时,代码运行没有错误。此外,该解决方案中的项目名称似乎都打印到终端上。但是,每个

Document
对象中
Project
实例的计数始终为 0。我知道情况并非如此,因此我添加了以下代码来尝试诊断问题:

foreach (WorkspaceDiagnostic diagnostic in workspace.Diagnostics)
{
    Console.WriteLine(diagnostic.Message);
}

我收到的诊断消息之一如下:

找不到导入的项目“C:\Program Files\Microsoft Visual Studio�2\Professional\MSBuild\Current\Bin md64\Current\Microsoft.Common.props”。 确认导入声明“C:\Program Files\Microsoft Visual Studio�2\Professional\MSBuild\Current\Bin md64\Current\Microsoft.Common.props”中的表达式正确,并且该文件存在于磁盘上。
C:\ Program Files \ dotnet \ sdk .0.408 \ Sdks \ Microsoft.NET.Sdk \ Sdk \ Sdk.props

我检查了上述路径是否存在

"C:\Program Files\Microsoft Visual Studio\2022\Professional\MSBuild\Current\Bin\amd64\Current\Microsoft.Common.props"
不存在,而
C:\Program Files\dotnet\sdk\6.0.408\Sdks\Microsoft.NET.Sdk\Sdk\Sdk.props
确实存在。

我觉得这很奇怪,因为当我从 Visual Studio 2022 的主菜单中选择

Buid > Build Solution
项时,解决方案构建得很好。它也可以使用
msbuild
从命令行构建得很好。

这里可能出了什么问题?

编辑

工作解决方案:

// Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.MSBuild;
using Microsoft.Build.Locator;

string slnPath = "ThirdPartySolution.sln";

MSBuildLocator.RegisterDefaults();

MSBuildWorkspace workspace = MSBuildWorkspace.Create();
Solution s = await workspace.OpenSolutionAsync(
    Path.Combine(slnPath, "IntegratedProductionForecasting.sln")
);

foreach (WorkspaceDiagnostic diagnostic in workspace.Diagnostics)
{
    Console.WriteLine(diagnostic.Message);
}

foreach (Project p in s.Projects)
{
    Console.WriteLine(p.Name);
    Console.WriteLine(p.Documents.Count());
        
    foreach (Document d in p.Documents)
    {
        Console.WriteLine("\t" + d.Name);
    }
}

workspace.Dispose();

除此之外,您还必须确保在项目文件中为所有

ExcludeAssets="runtime"
包引用
除了 
Microsoft.Build.* 设置 Microsoft.Build.Locator

<ItemGroup> <PackageReference Include="Microsoft.Build" Version="17.7.2" ExcludeAssets="runtime"/> <PackageReference Include="Microsoft.Build.Framework" Version="17.7.2" ExcludeAssets="runtime"/> <PackageReference Include="Microsoft.Build.Locator" Version="1.6.10" /> <PackageReference Include="Microsoft.Build.Utilities.Core" Version="17.7.2" ExcludeAssets="runtime"/> <PackageReference Include="Microsoft.CodeAnalysis" Version="4.7.0" /> <PackageReference Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="4.7.0" /> </ItemGroup>
另请检查

链接以了解更多详细信息。

c# msbuild roslyn roslyn-code-analysis
1个回答
2
投票
© www.soinside.com 2019 - 2024. All rights reserved.