C#源码改造

C# source code transformation

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

我们想要实现类似于 Unity 的 API 更新程序工具 (https://docs.unity3d.com/Manual/APIUpdater.html) which automatically replaces calls to obsolete APIs. Are there are source weaving tools/frameworks for C#? I know there's Fody (https://github.com/Fody/Fody) 的功能,但它在 IL 级别而不是源级别运行。

我同意@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。

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

如果您的两个库除了一些命名法之外几乎没有什么区别,那么您可能想要编写一个适配器,它将接受一个 API 集并成为另一个的传递,但有一些命名更改。将这个想法与 Unity 和继承相结合,这可能是一个成本低廉的解决方案。