1

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

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

4

2 回答 2

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 不执行任何语义分析。所以,我的推荐仍然是罗斯林。

于 2018-04-04T08:22:28.283 回答
0

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

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

于 2018-04-04T21:46:08.143 回答