Roslyn中是否支持访问降级后的C# AST?
目前官方公开的Roslyn API确实没有提供直接访问降级后C# AST的公共入口。
你观察到的Lowering阶段相关类型全部标记为内部类型是Roslyn团队的有意设计:降级后的语法结构属于C#编译器的内部实现细节,会随着C#版本迭代、编译器优化逻辑调整频繁发生变动,如果将这部分逻辑作为公共API开放,需要承担极高的向后兼容维护成本,因此官方不会将这部分能力对外公开。
针对你的开发场景,有三个可落地的替代方案可供选择:
- 方案一:通过反射调用内部Lowering接口
你可以通过反射访问Roslyn的内部降级逻辑,以此拿到处理后的中间结构。但该方案缺陷非常明显:内部API没有任何兼容承诺,只要Roslyn版本更新就可能出现调用失效的问题,需要绑定固定版本的Roslyn包使用,鲁棒性较差。 - 方案二:自行实现语法降级逻辑
你可以参考Roslyn Lowering阶段的开源实现,自己开发语法转换器,将高阶语法节点(比如模式匹配、using声明、异步方法、插值字符串等)转换为等价的低阶语法树。该方案虽然需要前期投入开发成本,但逻辑完全可控,兼容性不受Roslyn版本更新影响,你只需要覆盖自己需要支持的C#语法特性即可,不需要完全复刻Roslyn的所有降级步骤,开发量可控,也是当前多数同类代码生成工具的主流选择。 - 方案三:基于生成的IL做转换
你可以直接调用Roslyn编译得到最终的IL字节码,再基于IL生成对应的Mono.Cecil调用逻辑。该方案不用处理不同C#版本的新语法适配问题,但需要额外开发IL到Cecil调用的映射逻辑,你可以根据自己的开发成本预算选择是否采用。
内容的提问来源于stack exchange,提问作者Vagaus
相关产品推荐
相关产品推荐

