【问题标题】:C# source code transformation [closed]C#源代码转换[关闭]
【发布时间】:2018-08-12 17:30:22
【问题描述】:

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

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

【问题讨论】:

  • 在 IL 级别操作,而不是在源代码级别 我认为它们都是 IL 级别的工具。除此之外......您可以使用 Roslyn 来解析代码并对其进行转换?
  • 这是我最简单的选择吗?这听起来像是很多工作,我无法证明花时间是合理的。
  • 标签错误:这不是源码编织,而是源码转换。源编织是当您想要为每次编译添加预处理或后处理步骤时,您想要的是代码的一次性转换。
  • 使用 Roslyn 应该很容易做到,它可以在源代码级别上运行,就像您需要的那样。
  • @Georg 相应地编辑了标题,但找不到标签。

标签: c# unity3d compile-time-weaving


【解决方案1】:

我同意来自 cmets 的 @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。

【讨论】:

  • 谢谢,这非常有帮助!我看了看 Roslyn,它看起来很简单。我想我会同意的。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    相关资源
    最近更新 更多