使用源代码生成替代System.Reflection实现IoC DI服务解析
以下是可能导致你无法找到生成类的核心问题及对应解决思路:
项目引用方式错误
源代码生成器不能用普通项目引用,必须配置为分析器模式。在Enliven.Host的csproj文件中,要这样引用生成器项目:<ProjectReference Include="..\Enliven.SourceGenerator\Enliven.SourceGenerator.csproj" PrivateAssets="all" ReferenceOutputAssembly="false" />普通引用不会让Roslyn加载生成器,自然不会执行代码生成逻辑。
生成器未标记必要特性
你的生成器类必须标注[Generator]特性(来自Microsoft.CodeAnalysis包),同时继承ISourceGenerator接口,示例如下:using Microsoft.CodeAnalysis; [Generator] public class BootstrapperGenerator : ISourceGenerator { // 生成逻辑实现 }缺少这个特性的话,Roslyn不会识别这是一个源代码生成器,不会触发代码生成。
生成代码的命名空间不匹配
检查生成的Bootstrapper类的命名空间是否和你在Enliven.Host中引用的一致。比如生成器输出代码的命名空间是Enliven.Host.Internal,那你需要在Host项目中添加对应的using语句,或者直接用完全限定名引用。生成器逻辑未触发代码输出
如果你的生成器是基于自定义特性触发的,要确认Enliven.Host项目中有没有使用对应的特性标记服务类,或者生成器的语法分析逻辑是否存在bug,导致没有检测到生成条件。可以通过以下方式验证:- 在生成器中用
GeneratorExecutionContext.ReportDiagnostic输出调试信息,查看是否触发了生成逻辑 - 检查
Enliven.Host项目的obj\Debug\netX\generated\Enliven.SourceGenerator\目录,确认是否存在生成的代码文件
- 在生成器中用
IDE缓存或构建问题
有时候IDE的缓存会导致生成的代码不被识别,尝试以下操作:- 执行清理解决方案(Clean Solution)后重新构建(Rebuild Solution)
- 删除
Enliven.Host项目的obj和bin目录,再重新构建 - 重启IDE
目标框架不兼容
确保Enliven.SourceGenerator的目标框架和Enliven.Host兼容。比如Host用.NET 8,生成器最好设置为.NET 8或.NET Standard 2.0(Roslyn支持的通用版本),避免因框架不兼容导致生成器无法运行。生成器项目缺少必要依赖
源代码生成器需要引用Microsoft.CodeAnalysis.CSharp和Microsoft.CodeAnalysis.Analyzers包,并且设置PrivateAssets="all",示例配置如下:<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.8.0" PrivateAssets="all" /> <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" PrivateAssets="all" />
内容的提问来源于stack exchange,提问作者nop

