我正在尝试使用已提供给我的第三方解决方案的 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>
另请检查
需要在使用 MSBuildWorkspace 之前使用 MSBuildLocator 注册 MSBuild 实例。如果您尝试分析 SDK 样式项目,您还应该让您的应用程序面向 .NET Core,而不是 .NET Framework。
我强调这个答案的第一部分的“当前”,因为我实际上正在努力删除