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
相关产品推荐
相关产品推荐

