C#源代码转换

时间:2018-03-05 05:34:48

标签: c# unity3d compile-time-weaving

我们正在尝试将大型代码库从一个UI库迁移到另一个UI库。这两个库在概念上非常相似,在大多数情况下具有一些命名差异。我们希望尽可能多地实现自动化。

我们希望实现类似于Unity的API更新工具(https://docs.unity3d.com/Manual/APIUpdater.html)的功能,该工具会自动替换对过时API的调用。是否有针对C#的源代码编织工具/框架?我知道那里的Fody(https://github.com/Fody/Fody)但是它在IL级别运行,而不是在源级别。

2 个答案:

答案 0 :(得分:0)

我同意@ ta.speot.is的意见,我想Roslyn将是最好的选择。 Roslyn的主要优点是它支持C#的所有(包括最新的)功能,并且它进行语义分析,因此您实际上可以知道该方法的含义并使用它进行过滤。 Roslyn的缺点是它对代码生成并不是很好,因为Roslyn使用的数据结构是不可变的,但除非你的转换非常复杂,我想这不必打扰你。

甚至有一个使用Roslyn进行源代码转换的官方示例,非常接近我认为您需要的内容:https://github.com/dotnet/roslyn/wiki/Getting-Started-C%23-Syntax-Transformation

根据代码的年龄,CodeDOM也可以替代:将代码读取为CodeDOM,转换CodeDOM并从中生成代码。但是,CodeDOM只是为了支持所有主要.NET语言的共性,所以如果你这样做会丢失很多。如果您的代码使用lambda表达式或协方差,元组甚至合并运算符(??)之类的东西,我认为CodeDOM对您没有多大帮助。此外,CodeDOM不执行任何语义分析。所以,我的建议仍然是Roslyn。

答案 1 :(得分:0)

还有另一种可能的解决方案,具体取决于实施它所需的工作量。

如果你的两个库除了一些命名法之外它们之间几乎没有区别,那么你可能想要编写一个适配器,它将采用一个API集并传递给另一个,并进行一些命名更改。将这个想法与Unity和继承相结合,这可能是一个廉价的解决方案。