接受的答案似乎不再是最新的:有一个支持 .NET 的 NuGet 包 Microsoft.CodeAnalysis.Workspaces.MSBuild核心控制台应用:
用以下几行试用那个包:
using Microsoft.CodeAnalysis.MSBuild;
...
var workspace = MSBuildWorkspace.Create();
var solution = workspace.OpenSolutionAsync(solutionFile.FullName).Result;
...它引发了异常。我发现一个帖子 (https://github.com/dotnet/roslyn/issues/17401#issuecomment-282605950) 添加了一些其他的 NuGet 包,这些包似乎是依赖项。这在我的 csproj 中做了引用:
<PackageReference Include="Microsoft.Build" Version="16.7.0" />
<PackageReference Include="Microsoft.Build.Framework" Version="16.7.0" />
<PackageReference Include="Microsoft.Build.Tasks.Core" Version="16.7.0" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.7.0" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="3.7.0" />
<PackageReference Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="3.7.0" />
有了这些参考资料,我开始工作了(我在 Windows 上工作)。
但是,我遇到了 Microsoft.CodeAnalysis.Project 的文档计数为 0 并且 someProject.GetCompilationAsync().Result.SyntaxTrees 为空的问题。 “MSBUILD_EXE_PATH”设置不正确(请参阅https://github.com/dotnet/roslyn/issues/22415)。起初我选择这样设置最新的 MSBuild.dll:
private static void SetMSBuildPath()
{
var latestSdk = new DirectoryInfo(@"C:\Program Files\dotnet\sdk\").EnumerateDirectories().Where(f => Regex.IsMatch(f.Name, @"\d+\.\d+\.\d+"))
.OrderByDescending(f => f.Name.Split(".")[0])
.ThenByDescending(f => f.Name.Split(".")[1])
.ThenByDescending(f => f.Name.Split(".")[2])
.FirstOrDefault();
Environment.SetEnvironmentVariable("MSBUILD_EXE_PATH", Path.Combine(latestSdk.FullName, "MSBuild.dll"));
}
但更好的方法是使用 NuGet 包 Microsoft.Build.Locator 并在应用程序的开头调用它一次,如下所示:
MSBuildLocator.RegisterDefaults();
为此,请确保按照documentation 的建议,从您使用的Microsoft.Build.* NuGet 包(Microsoft.Build.Locator 除外)中排除 MSBuild(这会更改上面显示的 PackageReferences):
<PackageReference Include="Microsoft.Build" Version="16.7.0" ExcludeAssets="runtime" />
<PackageReference Include="Microsoft.Build.Framework" Version="16.7.0" ExcludeAssets="runtime" />
<PackageReference Include="Microsoft.Build.Locator" Version="1.2.6" />
<PackageReference Include="Microsoft.Build.Tasks.Core" Version="16.7.0" ExcludeAssets="runtime" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.7.0" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="3.7.0" />
<PackageReference Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="3.7.0" />
PS:我还没有研究过,但也许https://github.com/daveaglick/Buildalyzer(NuGet 包“Buildalyzer”)可以解决所有这些问题。