将ISourceGenerator转为IIncrementalGenerator后生成代码无法引用
排查IIncrementalGenerator生成代码无法被测试项目引用的问题
以下是几个核心排查方向:
检查项目引用与依赖传递
若生成器在单独类库项目中,测试项目必须直接引用该类库。如果通过NuGet包引入生成器,要避免将PrivateAssets设为all(这会阻断生成代码被依赖项目访问),可在测试项目的PackageReference中配置:<PackageReference Include="YourGeneratorPackage" Version="x.x.x" PrivateAssets="none" />同时确保生成器项目的目标框架(如
netstandard2.0)与测试项目兼容,满足Roslyn运行环境要求。验证生成代码的访问修饰符与命名空间
确认生成的接口是public修饰,且测试项目已通过using语句引入对应命名空间,或使用完全限定名引用。调试时可见代码不代表访问权限正确,若误设为internal,测试项目会无法访问。检查增量生成器的触发条件
IIncrementalGenerator的生成逻辑依赖输入增量更新,需确保测试项目编译时满足触发条件:- 若生成器基于特定属性、类标记触发,测试项目中是否包含这些触发元素?
- 检查生成器
CreateInitializationContext或RegisterSourceOutput逻辑,是否过滤掉了测试项目的输入(比如判断项目类型、框架版本等,导致测试项目未触发生成)。
确认测试项目的编译配置
测试项目的.csproj需配置允许访问生成代码的项:<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles> <CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\Generated</CompilerGeneratedFilesOutputPath>同时确认测试项目的目标框架与生成器兼容,避免因框架版本过低导致生成代码无法被识别。
清理并重新构建解决方案
缓存的中间文件可能引发异常,删除所有项目的obj和bin目录后,重新构建整个解决方案,确保生成代码为最新状态。
内容的提问来源于stack exchange,提问作者ScottishTapWater
相关产品推荐
相关产品推荐

