【问题标题】:Can a Delphi 4 and/or Delphi 5 executable be integrated into a C# application?可以将 Delphi 4 和/或 Delphi 5 可执行文件集成到 C# 应用程序中吗?
【发布时间】:2012-04-18 09:05:39
【问题描述】:

可以将 Delphi 4 和\或 5 应用程序功能 (.exe) 集成到 C# 应用程序中吗?

我的任务是重写一个新应用程序,该应用程序将基于现有的 Delphi 4/5 编写的应用程序,该应用程序目前与我公司没有人理解的批处理脚本一起保存。

作为一个中间解决方案,我被要求调查是否可以将 C# GUI\包装器放在顶部,以便更容易维护和运行。

我知道可以使用反射在 C# 应用程序中调用 Delphi 6 应用程序,但我不完全确定如何。

那么回到我最初的问题,可以在 C# 应用程序中调用 Delphi 4/5 应用程序功能吗?

提前致谢。

【问题讨论】:

  • 顺便说一句,我不知道反思会在哪里出现。你确定这就是你的意思吗?
  • 几年前我只看过代码,但有人向我解释说它是使用反射来调用Delphi exe,然后在exe中调用某些方法。不幸的是,这是在以前的公司工作,我无法再访问代码了。
  • 这毫无意义。 C# 反射不能在 Delphi exe 上工作。
  • @DavidHeffernan 如果将 Delphi 编译为 IL 程序集,它可以在 Dephi exe 上运行。在此处查看版本 8 及更高版本:en.wikipedia.org/wiki/Embarcadero_Delphi#Versions
  • @phoog 那不是德尔福。这就是 Delphi.net,一个完全不同的野兽。

标签: c# delphi integration compatibility legacy


【解决方案1】:

这个问题的基本前提似乎是围绕 Delphi 核心的 C# 包装器更易于维护和运行,如果不是这样,那么创建包装器的想法就变得不是很有用。我认为这是一个错误的概念。

想象一下,我做了一个可以与望远镜对话的应用程序。它完美地做到了。在这种情况下,我可以只提取望远镜通信部分并将其放入 DLL 中,然后用 C# 编写一个用户界面,使用 Delphi DLL 来执行与望远镜通信的任务。但是,除非您的 Delphi 应用程序已经以一种很好的方式构建,并且除非已经存在像这个望远镜通信库这样的任务,否则您将发现提取 Delphi 应用程序的任何部分并从 C# 中使用它并不容易。如果存在这种情况,我将使用本机 Delphi DLL 函数导出并从 C# 调用它们。这不使用现有的 delphi 可执行文件,并且需要花费大量时间将 Delphi 应用程序的一部分重构为可以在 C# 中使用的东西。

另一个答案提到了 COM 服务器,虽然这是可能的,但它不会让事情变得更容易;就像关于正则表达式的老笑话一样;当您遇到问题并尝试使用正则表达式解决时,现在您遇到了两个问题。当您尝试使用 COM 服务器来隐藏现有应用程序并使用 C# 在其上编写全新的 UI 时,情况也是如此。实际上,以这种方式改进、调试和继续开发它需要更多的技术技能,而不是纯粹用 delphi 或纯粹用 C# 继续开发它。这是一种消极的努力。

您没有提供有关 Delphi 应用程序做什么的信息,但让我们假设它是读取某种文件格式、执行某种通信协议、甚至连接到某个旧数据库的业务线或垂直市场应用程序,你不想重写。

如果你的意思是制作 C# UI,永远不要显示 Delphi 应用程序用户界面并将其替换为 C# 界面,那么几乎可以肯定你的想法不会让任何事情变得更好,而只会让事情变得更好更差。您的僵局要么来自没有熟练的 delphi 开发人员,要么来自没有聪明的开发人员能够弄清楚现有应用程序的功能。

当您处于这种情况时,解决方案通常是人工解决方案;要么聘请熟练的 delphi 开发人员并将应用程序带入现代 Delphi 时代(Delphi XE2),要么聘请熟练的非 delphi 开发人员并将应用程序移植到其他语言。任何建议在 delphi 应用程序之上编写“包装器”并认为这会使它“更容易”的人显然无法重写现有的应用程序。

可以肯定的是,我对您的 delphi 应用程序的功能了解不多,但在我看来,这确实像是“恐惧驱动”的决定。包装旧代码几乎从来都不是一个好主意,而且通常只会产生更多问题。

【讨论】:

  • 我的任务是重写应用程序,我有维护和开发 Delphi 软件的经验。我将把应用程序移植到 C# 作为长期解决方案,但与此同时,我被问到是否可以创建一个包装器来替换将它们组合在一起的批处理脚本语言。一位没有任何软件开发经验的经理问我这个问题。我同意完全重写是最好的选择,但我被要求调查是否可能。
  • 好吧,最好的选择不是重写它,而是在移植到 XE2 之后继续在 Delphi 中维护它。但既然你的任务比头脑更权威,我祝你好运。 :-)(有数百家公司将他们的 Delphi 应用程序重写为 C#,通常是因为他们认为这样可以雇佣更多的人为他们工作。我碰巧认为这很疯狂。培训人员。)
  • 感谢您的反馈。该公司是微软的合作伙伴,因此他们渴望将每一个软件都移植到 .NET。从长远来看,我相信这是最好的解决方案,因为我是业内唯一的 Delphi 到 C# 开发人员。
  • 那么完全有道理。 .Net 是微软的平台,合作伙伴肯定会做出任何可能的架构改变,以适应生态系统。 C# 是一门很棒的语言,.net 是一个很好的平台。我反对重写应用程序的原因是,无论您重写的语言是 C#、Java 还是 Python,都需要付出巨大的努力才能回到原来的位置。至少 C#/.Net 是一个很好的目标平台。
【解决方案2】:

可以从 C# 运行 Delphi .exe。但我想这不是你的重点。

您可以使用标准的 COM 服务器,但需要在计算机上注册 COM 对象(通过运行regsrv32.exe)。部署起来并不容易。

或者您可以将 Delphi 代码定义为库,然后加载并执行 .dll from the C# code

如果您更喜欢从 Delphi 4 或 5 访问 C# 对象(即访问 C# RTTI),则必须使用一些低级单元,例如 Managed extensions for VCL - .Net interop for Delphi Win32。这是相当完整的,并且可以与旧版本的 Delphi 一起使用(遗憾的是,比 Hydra 更高级别的东西不支持 Delphi 4 或 5)。

编辑

另一种可能的简单通信是 GDI 消息。您可以从 C# 代码发送 GDI 命令来控制 Delphi 应用程序,但使用 PostMessage() API 调用。

【讨论】:

    【解决方案3】:

    【讨论】:

    • 不完全是我的意思。我想从 C# 应用程序调用 Delphi 应用程序中的某些方法。不过还是谢谢。
    • @zeencat 问题就是问题。您通常不会调用 .exe 文件的方法。你只需运行它们。除非exe是COM服务器,但你没有提到。您需要解决问题以包含一些真实的细节。
    【解决方案4】:

    Delphi 5 支持实现 COM 服务器功能(不知道早期版本,D2 肯定没有)。

    如果你有可用的资源,

    • 添加类型库和类型库中定义的接口的 COM 实现,

    • 注册可执行文件(通常在启动时自动完成,这要归功于 Delphi 魔法)

    • 按照 MSDN 上的步骤操作:Exposing COM Components to the .NET Framework

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      相关资源
      最近更新 更多