You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#增量源代码生成器无输出问题求助

C#增量源代码生成器无代码生成问题排查方案

1. 生成器项目配置检查

确保生成器类库的.csproj包含必要配置,避免依赖和输出问题:

<PropertyGroup>
  <TargetFramework>netstandard2.0</TargetFramework>
  <LangVersion>latest</LangVersion>
  <Nullable>enable</Nullable>
  <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
</PropertyGroup>

<ItemGroup>
  <!-- 必须指定PrivateAssets="all",防止依赖传递到引用项目 -->
  <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.8.0" PrivateAssets="all" />
  <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" PrivateAssets="all" />
</ItemGroup>

2. 生成器类的正确性验证

确认生成器类满足Roslyn的加载要求:

  • 必须标记[Generator]特性(来自Microsoft.CodeAnalysis命名空间)
  • 必须实现IIncrementalGenerator接口
  • RegisterSourceOutput方法中,文件名需唯一且以.g.cs结尾(Roslyn约定的生成代码后缀)

示例正确实现:

using Microsoft.CodeAnalysis;

[Generator]
public class MyIncrementalGenerator : IIncrementalGenerator
{
    public void Initialize(IncrementalGeneratorInitializationContext context)
    {
        // 节点过滤逻辑
        var targetNodes = context.SyntaxProvider
            .CreateSyntaxProvider(
                (node, _) => node is ClassDeclarationSyntax, // 示例:筛选类声明
                (ctx, _) => ctx.Node as ClassDeclarationSyntax)
            .Where(node => node != null && node.Identifier.Text.StartsWith("My"));

        // 注册代码输出
        context.RegisterSourceOutput(targetNodes, (spc, classNode) =>
        {
            var generatedCode = $$"""
                // <auto-generated />
                public static class {{classNode.Identifier.Text}}Extensions
                {
                    public static string GetName(this {{classNode.Identifier.Text}} instance)
                    {
                        return instance.GetType().Name;
                    }
                }
                """;
            // 文件名必须唯一,后缀为.g.cs
            spc.AddSource($"{classNode.Identifier.Text}Extensions.g.cs", generatedCode);
        });
    }
}

3. 目标项目引用生成器的正确方式

在.NET6 WebAPI等目标项目的.csproj中,必须以分析器类型引用生成器项目,而非普通项目引用:

<ProjectReference Include="..\MyGeneratorProject\MyGeneratorProject.csproj"
                  OutputItemType="Analyzer"
                  ReferenceOutputAssembly="false" />
  • OutputItemType="Analyzer"告诉Roslyn将该项目作为源代码生成器加载
  • ReferenceOutputAssembly="false"避免将生成器的程序集作为普通依赖引用

4. 代码输出与静默错误排查

  • 检查生成的代码字符串是否存在语法错误:Roslyn会静默丢弃非法代码,不会抛出错误
  • 调试时通过Debug.WriteLine(generatedCode)输出代码内容,确认逻辑生成的代码符合预期
  • 确保AddSource的文件名唯一,避免不同生成内容覆盖导致无输出

5. 生成器加载诊断检查

  • 在Visual Studio中启用生成器诊断:工具 > 选项 > 文本编辑器 > C# > 高级,勾选显示生成器诊断和显示分析器诊断
  • 查看错误列表的分析器标签,是否存在生成器加载失败的隐藏警告(比如依赖缺失、版本不兼容)
  • 清理解决方案缓存:执行生成 > 清理解决方案,再生成 > 重新生成解决方案,避免旧缓存干扰

6. 目标项目配置检查

  • 确认目标项目的LangVersion不低于C# 9.0(增量生成器的最低要求),可在.csproj中设置:<LangVersion>9.0</LangVersion>
  • 检查是否禁用了源代码生成:若存在<DisableSourceGenerators>true</DisableSourceGenerators>则删除该配置

内容的提问来源于stack exchange,提问作者Nikola Tomasevic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 23:00:54