【问题标题】:Migrate an app from Delphi to Silverlight C#将应用程序从 Delphi 迁移到 Silverlight C#
【发布时间】:2026-02-15 04:10:01
【问题描述】:

我有一个使用 Delphi 5 和 Paradox 开发的旧式桌面会计应用程序,我打算将其迁移到带有 SQL Server 的基于 Web 的 Silverlight(为了 UX)应用程序。

任何人都可以提出一种快速实施的方法吗?

我知道这是一个非常开放的问题,我并不是在寻找具体的答案。而是来自 SO 用户的意见/经验。

我主要关心的是迁移方法、可能的架构和设计模式(对于 SL,我知道 MVVM)实现。

【问题讨论】:

  • 我对此也很感兴趣。我有一个需要迁移和考虑 Silverlight 的旧版 winform 应用程序。非常担心能够快速迁移。 MVVM 需要很长时间才能完成的许多恐怖故事。
  • @e36M3:我认为,使用 WinForms 应用程序的情况要好得多,因为如果不是大部分,至少可以重复使用代码的某些部分。但对我来说,这是一个完全重写的情况:-(

标签: delphi silverlight-4.0 c#-4.0 migration delphi-5


【解决方案1】:

快点?这是每个经理都想要的,但我对此表示怀疑。

您拥有完全不同的 UI 模型和不同的编程语言。 除非这些应用程序很小,否则不太可能在任何短时间内手动转换它们(或者甚至您自己,因为 OP 暗示“我打算”)。

Gartner Group 分析了手动迁移,并建议如果一切都“相似”,则实际转换率为 ~~ 150 行/天,这是可能的,因为您或多或少地直接从一个工作的、经过调试的应用程序进行转换。 (SLOC 中的应用程序有多大?)因此,如果您有 75,000 行代码,那么您至少需要 500 个工日。您可能会认为 Delphi 作为编程语言和 C# 是相似的。对于 Delphi UI 和 Silverlight,您无法合理地证明这种情况,因此这个估计值是一个下限。

有些人说,“扔掉它,然后从头开始重新编码”。除非您的工作效率超过每天 150 行已调试的代码(经典软件工程教科书会告诉您它比这要小得多),否则这将花费您更长的时间。通常它会失败,因为您最终忘记了当前程序中存在哪些功能,并在开发后期重新发现它们,或者在尝试重新部署后更糟。通常发生的情况是旧应用程序在构建新应用程序的同时继续发展(请记住,您距离新应用程序最少 500 个工作日!)并且新应用程序必须赶上这些变化。如果应用程序具有任何严重的规模(例如,一百万行),这通常会阻止新的应用程序可用。另一种思考方式是,“构建原始应用程序需要多长时间?”,以及“为什么构建替代应用程序要容易得多?”。 YMMV,如果你能创造奇迹。

我非常偏颇的观点(我构建语言翻译工具)是,最实用的方法之一是自动翻译。这也有其代价。无论有人告诉你什么,它们都不是现成的物品。您已经设置了翻译器,这也需要耗费大量精力,但该精力与所使用的语言和(UI)库功能的大小成正比,而不是比应用程序大小,因此随着程序变大,它会更有效。对于语言翻译部分,这仍然需要数百个工作日的编码和测试。不同之处在于,一旦设置完毕,您就可以将其应用到任何大小的现有应用程序中,无论它处于何种状态。还有比这更多的复杂性,但这种方法克服了手动转换的“赶不上”问题,以及“无法获得足够的编码人员来手动翻译它”。

更多详情请看我的answer on how to translate between languages

如果您的应用程序相对较小,恕我直言,没有好的答案。手工翻译或重新编码可能是你唯一(丑陋的)选择。

【讨论】:

    【解决方案2】:

    我的建议是在需要额外功能时使用 Silverlight 为您的应用程序创建“增值”附加功能和更新,直到您获得类似于完整产品的东西。

    对我来说,开发 Silverlight 似乎需要很长时间,而且与 ASP.NET Ajax 相比,业务应用程序的 UX 并没有大幅改进(如果 Ajax 做得正确的话)。我想如果你今天坐下来在 Silverlight 中完全重新编写一个体面大小的应用程序,那么在你的开发完成之前,Silverlight 的生命周期就会结束(当然,除非你组建了一个庞大的团队)

    【讨论】:

      【解决方案3】:

      如果您的业务逻辑与 UI 分离得很好,您可以从将代码“移植”到 Delphi Prism 而不是 C# 开始。这提供了更短的迁移路径。如果您的业务逻辑与 UI 紧密耦合(就像 10 到 15 年前经常发生的那样),那么从头开始重写所有内容可能是一个更好的主意。

      一旦你在 Pascal 中启动并运行了所有代码,在反编译器的帮助下用 C# 重写它(如果你最后需要它)几乎是微不足道的。

      【讨论】: