Roslyn源代码生成器被“忽略”?

10
我正在创建一个简单的 Roslyn 源代码生成器。在调试时,生成器似乎运行良好,并能正确生成所需的类。然而,在解决方案的另一个项目中引用它时,会显示一个红色图标,提示为“已忽略”,并且没有任何输出产生:

Ignored!

生成器代码非常简单:
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 { } }"
            );
        }
    }
}


我检查了以下内容:
  • 生成器项目的目标是.NET Standard 2.0
  • 引用项目的目标是.NET 6
  • 生成器项目中的Microsoft.CodeAnalysis.CSharpMicrosoft.CodeAnalysis.Analyzers都是最新的
  • VS已经更新到最新版本(17.4.4)
  • .NET编译器平台SDK已安装
为什么它不起作用?

1
那个“忽略”标志是用于源代码控制的:任何生成的文件都不会被添加/存储。除非有编译器错误,否则生成器本身应该能正常工作。 - Hans Kesting
1
代码中期望生成器应用的csproj是什么样子?请注意,项目对项目的引用并不是非常可靠 - 将其作为包引用会更好;然而,类似于<ProjectReference Include="..\relativepathhere\CompetencesSourceGenerator.csproj" PrivateAssets="all" ReferenceOutputAssembly="false" OutputItemType="Analyzer" />这样的代码可能有效。请特别关注那些额外的属性。 - Marc Gravell
1
还要注意,一旦从本地项目加载源生成器,VS 真的不喜欢卸载它(例如,如果您更改它并重新编译它)。 您需要关闭 VS(并确保所有相关的 OOP 进程已经结束)。请参见此处 - canton7
经过一些微调,生成器现在似乎正在运行。但是,.g.cs文件没有更新,您实际上也无法看到当前可编译的源代码。这是已知的问题吗? - Impworks
1个回答

3

所以显然,这个问题由三个因素引起,它们的组合导致了非常令人困惑的用户体验:

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

值得一提的是,在Rider中,一切都和预期一样正常,所以我希望他们在VS中解决这种行为问题。


3
被忽略的图标是源代码控制错误,如 https://github.com/dotnet/project-system/issues/8202 所述。这与我们是否忽略生成器以运行它无关。 - Jason Malinowski
你能分享一下两个.csproj文件的内容吗?我问这个是因为我在使用Rider时,生成的文件(".g.cs")被忽略了。 - greenoldman
你能分享一下两个.csproj文件的内容吗?我问这个是因为我在使用Rider,这个文件(".g.cs")是自动生成的,但被忽略了。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接