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

C# Source Generator项目引用引入后生成结果未被包含问题

C# Source Generator修改代码后停止生成文件问题处理

问题表现

  • 通过本地项目引用配置C# Source Generator,NUnit测试全部通过,生成逻辑本身无问题,但最简测试项目在Visual Studio 2022 Preview 5.0中无法编译、提示相关错误
  • 调用Debugger.Launch()调试后确认:生成器代码运行正常,生成的源文本完全符合预期,IDE和编译器报错的核心原因是生成结果未被纳入编译
  • 查看解决方案资源管理器Analyzers节点可复现异常:
    • 刚打开解决方案时生成器运行正常,对应生成器节点下可以看到生成的_NotifyChangedClass_Notify.cs文件
    • 对代码做少量修改后,生成器停止运行,所有生成内容消失,节点提示This generator is not generating files.
  • 问题后续自动恢复正常,暂未定位到明确根因,大概率为Visual Studio预览版已修复的Bug

相关配置与代码

生成器项目配置(generator.csproj)

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <LangVersion>10</LangVersion>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <IncludeBuildOutput>false</IncludeBuildOutput>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.3">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.8.0" PrivateAssets="all" />
  </ItemGroup>
</Project>

测试项目配置(testproject.csproj)

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="..\MySourceGenerators\MySourceGenerators.csproj" 
                      OutputItemType="Analyzer"
                      ReferenceOutputAssembly="false"/>
  </ItemGroup>
</Project>

生成器核心代码(generator.cs)

[Generator]
public class NotifyPropertyChangesGenerator : ISourceGenerator
{
    public void Execute(GeneratorExecutionContext context)
    {
        var receiver = (NotifySyntaxReceiver)context.SyntaxReceiver!;
        if (receiver.Classes.Count > 0)
        {
            foreach (var c in receiver.Classes)
            {
                /* 生成源文件逻辑 */
                var source = SyntaxFactory.ParseCompilationUnit(builder.ToString())
                    .NormalizeWhitespace()
                    .GetText(Encoding.UTF8, Microsoft.CodeAnalysis.Text.SourceHashAlgorithm.Sha256);
                context.AddSource($"_{c.ClassDeclaration.Identifier.ValueText}_Notify.cs", source);
            }
        }
    }
    public void Initialize(GeneratorInitializationContext context)
    {
        context.RegisterForSyntaxNotifications(() => new NotifySyntaxReceiver());
    }
}

class NotifySyntaxReceiver : ISyntaxReceiver
{
    public List<NotifyClass> Classes { get; } = new();
    public void OnVisitSyntaxNode(SyntaxNode syntaxNode)
    {
        if (syntaxNode is ClassDeclarationSyntax cds)
        {
            /* 匹配需要生成代码的类的逻辑 */
        }
    }
}

测试项目代码(testproject.cs)

internal class NotifyChangedClass : INotifyPropertyChanged
{
    string n_Property;
}

同类问题排查建议

  • 先检查生成器项目配置的拼写错误:原始配置中IncludeBuildOutpout为拼写错误,正确应为IncludeBuildOutput,该配置错误会导致生成器输出无法正常被识别
  • Visual Studio预览版本身存在大量与Source Generator相关的已知Bug,遇到类似异常可先升级到最新正式版验证
  • 生成器添加源文件时建议补全.cs后缀,避免部分版本编译器无法识别生成的文件类型
  • 清理解决方案、删除.vs缓存目录后重启Visual Studio,多数增量生成异常可通过该操作解决

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:54:04