c# - 源生成器在同一项目中看不到类

标签 c# sourcegenerators

我有一个源生成器,它看起来像这样:

public class Generator : ISourceGenerator
{

    public Generator()
    {
        // Uncomment if you want to debug this
        Debugger.Launch();
    }
    public void Initialize(GeneratorInitializationContext context)
    {
        context.RegisterForSyntaxNotifications(() => new MySyntaxReceiver());
    }

    public void Execute(GeneratorExecutionContext context)
    {
        var syntaxReceiver = (MySyntaxReceiver)context.SyntaxReceiver;

        var responseMessageClasses = syntaxReceiver.ResponseMessageClasses;
        // do stuff to responseMessageClasses
    }
}

internal class MySyntaxReceiver : ISyntaxReceiver
{
    public List<ClassDeclarationSyntax> ResponseMessageClasses { get; private set; } = new List<ClassDeclarationSyntax>();

    public void OnVisitSyntaxNode(SyntaxNode syntaxNode)
    {
        if (syntaxNode is ClassDeclarationSyntax cds &&
            cds.Identifier.ValueText.EndsWith("ResponseMessage", StringComparison.OrdinalIgnoreCase))
        {
            ResponseMessageClasses.Add(cds);
        }
    }
}

在同一个项目中,我有一个简单类的文件夹,其名称均以“ResponseMessage”结尾。这些类仅具有 string、int 和 bool 等简单类型作为属性。它们与 SourceGenerator 位于不同的命名空间中。

还有第二个控制台应用程序项目引用我的源生成器作为分析器。当我构建项目时,我可以成功侵入 SourceGenerator 代码。

问题:我的 SyntaxReceiver 类永远看不到简单的 ResponseMessage 类。 OnVisitSyntaxNode 方法仅命中 Program.cs 文件。这是怎么回事?

最佳答案

根据设计,不可能在定义源生成器的程序集中使用源生成器。根据the design spec :

Generator implementations are defined in external assemblies passed to the compiler using the same -analyzer: option used for diagnostic analyzers.

...

Since generators are loaded from external assemblies, a generator cannot be used to build the assembly in which it is defined.

关于c# - 源生成器在同一项目中看不到类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68081550/

相关文章:

c# - 没有从 Exocortex FFT 获得预期的输出

c# - 显式转换

c# - 确定 TreeView 中的哪个节点被单击

c# - .NET 6 的 System.Text.Json 源代码生成在哪里存储它的代码?

msbuild - C# Source Generator 应该刷新/删除发出的文件

visual-studio - 如何在 VS 2022 中调试 Roslyn 源代码生成器?

C# NET 5.0 源代码生成器基本示例不生成输出

c# - 如何使 Roslyn Analyzer 项目成为可传递依赖项?

c# - 文件传输仅第一次成功,随后失败

c# - 在 C# 中使用 RAII 安全吗?和其他垃圾收集语言?