.NET中是否可以按顺序链式调用多个Source Generator?
解决方案
要解决两个Source Generator的执行依赖问题,无需调整项目引用顺序,也不用手动处理生成文件输出,使用Roslyn原生的生成器依赖声明机制即可:
核心实现步骤
- 首先确保你的开发环境使用的是Roslyn 3.8及以上版本(对应.NET 5 SDK及以上版本)
- 在绑定生成器(
MLEM.Ui.Binding生成器)项目中引用Microsoft.CodeAnalysis.Analyzers包 - 给绑定生成器的类添加
[DependsOn("你的INotifyPropertyChanged生成器的完整类名(含命名空间)")]特性即可
DependsOn特性会告知编译器两个生成器的依赖关系,编译器会自动保证被依赖的INotifyPropertyChanged生成器优先执行,且绑定生成器的语法树访问逻辑可以直接读取到前序生成器产出的所有代码内容,无需额外操作。
之前方案无效的原因
- 项目引用顺序不会影响生成器的执行优先级,无依赖声明的生成器默认会被编译器并行执行,自然读取不到对方的生成内容
- 手动输出生成文件再引入到项目的方案,会导致生成的代码被编译器同时从输出目录和obj临时目录读取两次,必然会报重复定义错误,该方案完全不需要使用
额外注意事项
- 该依赖声明对普通
ISourceGenerator和增量IIncrementalGenerator都生效,不需要额外适配 - 确保INotifyPropertyChanged生成器生成的属性访问修饰符和你期望的一致,比如需要公开访问的属性要加
public修饰,避免绑定生成器遍历成员时过滤掉非公开内容
内容的提问来源于stack exchange,提问作者Steven Blom
相关产品推荐
相关产品推荐

