【问题标题】:Using Roslyn in NetCoreApp: MSBuildWorkspace not installed在 NetCoreApp 中使用 Roslyn:未安装 MSBuildWorkspace
【发布时间】:2020-11-12 23:27:27
【问题描述】:

我正在尝试学习如何使用 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 的任何程序集......但显然不是。

如何正确配置项目?

【问题讨论】:

    标签: c# roslyn


    【解决方案1】:

    很遗憾,MSBuildWorkspace is currently only supported on .Net Framework。您将无法从 .Net Core 使用它。

    【讨论】:

      【解决方案2】:

      接受的答案似乎不再是最新的:有一个支持 .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”)可以解决所有这些问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多