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

