17

我维护了一个用 Delphi 7 编写的旧的仅限 PC 的应用程序。虽然 Delphi 过去对我很有帮助,但我现在只将它用于这个应用程序,并且发现我的语言技能正在下降。它的语法与我的 Java/Ruby 的“日常工作”语言太不同了,所以我需要更长的时间才能进入编写新代码的凹槽,而且它太旧了,我没有使用很多interface,所以代码没有被管理现在对我来说似乎很古老!

我的许多用户正在迁移到 Vista,这可能会在兼容模式下运行应用程序,或者可能会遇到 GPF 问题,具体取决于他们的 IT 部门如何配置他们的 PC,因此我必须对应用程序进行一些维护。我想知道我是否应该跳到更熟悉的堆栈。

是否有一个自动化工具可以完成将代码库转换为 C# 的工作,让我专注于任何非标准组件的转换?我正在使用一个名为AbsoluteDatabase的嵌入式数据库组件,它与 BDE 兼容并始终使用标准 SQL,以及一个本机 Delphi HTML 浏览器组件,它可以与 Microsoft 世界中的某些东西交换。

这些转换工具有多好?

4

4 回答 4

14

我不知道有任何自动化工具可以进行这种转换。我个人建议你坚持使用 Delphi,也许只是升级到新版本。我见过几个代码 DOM 试图从 Delphi 转换为 C#,但这并没有解决库问题。

CodeGear(以前称为 Borland)有一个从 C# 到 Delphi的工具,可以正常工作。我会假设朝着另一个方向发展的工具也会起作用(需要大量编辑)。这是一个瑞典工具,它使用相同的 CodeDOM 原理从Delphi 到 C#(和许多其他语言)。还有其他的,我现在找不到。

另一种选择是升级到最新版本的 Delphi for .NET 并以这种方式将您的代码移植到 .NET。一旦你让它在 Delphi for .NET 中工作(这将非常容易,除了嵌入式 DB,除非它们有 .NET 版本)你可以使用.NET ReflectorFile Disassembler将 IL 反转为 C#。您仍将使用 VCL,但您可以使用 C# 代替 Object pascal。

另一个类似的解决方案是通过 RemObjects 将其移植到Oxygene。我相信他们有一个到 WinForms 的 Delphi Win32 迁移路径。然后使用.NET ReflectorFile Disassembler将 IL 反转为 C#。

简而言之,没有简单的答案。语言迁移比库迁移更容易。很大程度上取决于您使用的第 3 方组件(AbsoluteDatabase 之外)以及您是否直接在应用程序中进行了任何 Windows API 调用。

另一个完全不同的选择是寻找离岸团队来维护应用程序。他们可能可以很便宜地做到这一点。你可以在国内找人,但毫无疑问会花费更多(尽管美元贬值和就业市场不佳,你永远不知道......)

祝你好运!

于 2008-09-12T17:42:12.340 回答
7

John Brant 有一份科学报告,将一个 150 万行的 Delphi 项目成功转换为 C#。他在 AST 上编写了一个 Delphi 解析器、一个 C# 生成器和许多转换规则。逐渐扩展规则集,进行日常构建,大量单元测试,以及一些困难的 Delphi 部分的重写,使他有了一个 4 人的团队,其中一些原始开发人员具有深厚的 Delphi 和 C# 知识,可以迁移软件在 18 个月内。John Brant 是重构浏览器和 SmaCC 编译器构建工具包的原始开发者,您不太可能走得那么快

于 2013-10-25T17:08:33.490 回答
4

我的许多用户正在迁移到 Vista,这可能会在兼容模式下运行应用程序,或者可能会遇到 GPF 问题,具体取决于他们的 IT 部门如何配置他们的 PC,因此我必须对应用程序进行一些维护。我想知道我是否应该跳到更熟悉的堆栈。

除非您正在做一些非标准的事情,否则 D7 应用程序应该在 Vista 中运行良好。

至于转换为 C#,我认为大多数转换工具都是浪费时间。更好的方法可能是从头开始重写应用程序。

于 2008-09-15T09:38:47.313 回答
2

没有简单的答案,但请记住,该语言的 Delphi.net 变体以 .net 运行时为目标,并且 .net 上的不同语言可以紧密地互操作。

您可以尝试让它在 Delphi.Net 中编译,分解成不同的程序集,然后手动一个一个地转换程序集。Reflector 可以帮助将编译后的代码逆向工程为 C# 代码的骨架 - 等效但没有注释、内部变量名称等。

另一方面,Delphi.net 对于这个项目来说可能已经足够好了(TM)。

但是除非你有一个好的测试套件(我猜可能没有,考虑到 Delphi 7 的最新技术)你会引入错误。

于 2008-09-15T09:46:43.067 回答