1

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

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

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

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

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

提前致谢。

4

4 回答 4

2

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

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

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

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

编辑

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

于 2012-04-04T17:21:22.923 回答
2

该问题的基本前提似乎是围绕 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 应用程序的功能知之甚少,但在我看来,这听起来确实像是“恐惧驱动”的决定。包装旧代码几乎从来都不是一个好主意,而且通常只会产生更多问题。

于 2012-04-04T22:24:02.237 回答
1

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

如果你有可用的资源,

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

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

  • 按照 MSDN 上的步骤操作:将 COM 组件暴露给 .NET Framework

于 2012-04-04T16:09:32.063 回答
1

当然。C# 可以调用任何 .exe。只需使用 Process.Start:

http://www.dotnetperls.com/process-start

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx

于 2012-04-04T15:59:35.190 回答