Roslyn 源生成器被“忽略”?

Imp*_*rks 11 c# roslyn roslyn-code-analysis sourcegenerators

我正在创建一个简单的 Roslyn 源生成器。生成器在调试中似乎运行良好,可以正确生成所需的类。但是,当从解决方案中的另一个项目引用它时,它附近会显示一个红色图标,并带有“忽略”工具提示,并且不会生成任何输出:

被忽视了!

生成器代码非常简单:

namespace CompetencesSourceGenerator
{
    using Microsoft.CodeAnalysis;

    [Generator]
    public class CompetenceNamesGenerator: CompetenceGeneratorBase
    {
        public override void Execute(GeneratorExecutionContext context)
        {
            context.AddSource(
                "CompetenceNames.g.cs",
                @"namespace Foo { public class Bar { } }"
            );
        }
    }
}

Run Code Online (Sandbox Code Playgroud)

我检查了以下内容:

  • Generator 项目面向 .NET Standard 2.0
  • 引用项目目标 .NET 6
  • Microsoft.CodeAnalysis.CSharp生成器项目中的和Microsoft.CodeAnalysis.Analyzers都是最新的
  • VS 已更新 (17.4.4)
  • .NET 编译器平台 SDK 已安装

为什么它不起作用?

Imp*_*rks 6

显然,这个问题是由三个因素引起的,这三个因素的结合导致了非常混乱的用户体验:

  • “忽略”图标确实与生成器发出的文件相关,而不是生成器本身。将其显示在每个文件旁边会更有意义,我不知道为什么它会这样工作。
  • 生成的文件的内容不会在 UI 中更新。生成器运行,因此当您“立即”发出不正确的代码时,您将看到编译错误。要查看实际源代码,您需要完全关闭VS,重新打开它,重建项目,然后才能查看源代码。
  • 从同一解决方案中的项目引用生成器有点奇怪,因为有时它不会在“全部重建”上运行。

值得一提的是,在 Rider 中一切都按预期工作,所以我希望他们在 VS 中修复此行为。

  • 被忽略的图标是源代码控制错误,如 https://github.com/dotnet/project-system/issues/8202 中所述。它与我们是否为了运行生成器而忽略生成器无关。 (3认同)