在 NetCoreApp 中使用 Roslyn:未安装 MSBuildWorkspace
Using Roslyn in NetCoreApp: MSBuildWorkspace not installed
我正在尝试学习如何使用 Roslyn 从 C# 源文件中提取信息。但是我什至无法开始,因为我似乎找不到安装正确软件包的正确方法。
我正在尝试构建一个简单的 netcoreapp1.1 控制台应用程序。它的 csproj 文件如下所示:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp1.1</TargetFramework>
<PackageTargetFallback>portable-net45+win8</PackageTargetFallback>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis" Version="2.0.0" />
<PackageReference Include="Microsoft.Composition" Version="1.0.30" />
</ItemGroup>
</Project>
根据我在网上阅读的内容,我认为这足以加载任何包含 MSBuildWorkspace 的程序集...但显然不行。
如何正确配置项目?
不幸的是,MSBuildWorkspace
is currently only supported on .Net Framework。您将无法从 .Net Core 使用它。
接受的答案似乎不再是最新的:有一个 NuGet 包 Microsoft.CodeAnalysis.Workspaces.MSBuild 支持 .NET Core 控制台应用程序:
使用这些行试用该包:
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 的建议(这会更改 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”)解决了所有这些问题。
我正在尝试学习如何使用 Roslyn 从 C# 源文件中提取信息。但是我什至无法开始,因为我似乎找不到安装正确软件包的正确方法。
我正在尝试构建一个简单的 netcoreapp1.1 控制台应用程序。它的 csproj 文件如下所示:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp1.1</TargetFramework>
<PackageTargetFallback>portable-net45+win8</PackageTargetFallback>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis" Version="2.0.0" />
<PackageReference Include="Microsoft.Composition" Version="1.0.30" />
</ItemGroup>
</Project>
根据我在网上阅读的内容,我认为这足以加载任何包含 MSBuildWorkspace 的程序集...但显然不行。
如何正确配置项目?
不幸的是,MSBuildWorkspace
is currently only supported on .Net Framework。您将无法从 .Net Core 使用它。
接受的答案似乎不再是最新的:有一个 NuGet 包 Microsoft.CodeAnalysis.Workspaces.MSBuild 支持 .NET Core 控制台应用程序:
使用这些行试用该包:
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 的建议(这会更改 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”)解决了所有这些问题。