如何在C#和Delphi应用程序之间进行通信?

3
我需要将我的应用程序(Delphi+MS SQL Server:以下简称D)与另一个应用程序(c#+SQL Server:以下简称C)进行接口连接。C具有极简的Windows Forms用户界面,其主要作业是连接到PDA并从中发送和接收数据。因此,他们的想法是去除C用户界面,并仅保留与DB和PDA通信所需的代码。因此,我需要让C能够与D相互通信。D向C发送数据的某些事件(如TButton.OnPress),D会调用C公开的方法。C对于由C执行的一些操作做出反应时,C将调用D公开的某些方法。即使在第一阶段中D只是“公开存储过程”。我从未完成过这样的事情。该怎么办?D目前是单个exe(win32)。您建议使用哪种技术?

我不理解C到D的部分:因为C将没有UI,所以唯一使用它的方法是通过D。或者可能还有其他你在问题中没有展示的触发器!! - Najem
10个回答

2
如果C中的用户界面将被删除,那么我建议将C封装在一个COM对象中,这样你就可以从Delphi透明地使用它。

我向另一位开发者提供了你告诉我的所有选项,他选择了COM。顺便说一下,他将完成所有的工作,我只需调用函数,所以我把选择权交给了他。我没有说过这两个应用程序可能在同一台机器上运行。感谢大家。 - UnDiUdin

2

有很多选择。Socket可能是最强大的,但如果两个应用在同一台机器上运行,你可以使用窗口消息(WndProc和相关函数)或命名管道。


1

我认为你可以使用套接字。可以使用自己的协议或者选择Web服务,但后者相当复杂。Delphi有WSDL导入器,C++有gSOAP库。


你建议使用哪些组件(例如)?TCP客户端将使用Delphi编写,而TCP服务器将使用C#编写(或反之亦然)。 - UnDiUdin
@user193655 嗯,在Delphi中使用Indy组件。网络上有许多示例。在C#中,也可以在Google上查看示例。像这个http://www.c-sharpcorner.com/uploadfile/sthangaraju/tcpclientserverst11182005014316am/tcpclientserverst.aspx - Vladislav Rastrusny

1

RemObjects SDK原生支持Delphi和.NET程序。它是基于更底层的东西的一个额外层,但可能会使事情变得更容易。


嗨,我想使用一些默认组件,因为通信非常简单。 - UnDiUdin

1
如果它们都使用相同的数据库,您可以将其用作它们之间的管道。
在一个应用程序中,写入特定表格,在另一个应用程序中通过定期轮询该表格来“监听”该表格,删除已处理的任何“消息”。
这是一般的想法,好处是您可以立即执行它,而不需要使用任何库。

1
起初我并没有考虑这个想法,但它在某种程度上是有道理的。我的意思是,对于数据部分,我可以使用数据库,但为了拥有一个响应迅速的应用程序,我需要更快的响应速度,我不能每2秒轮询数据库。因此,也许我可以使用套接字来查看是否有需要轮询的内容,然后再轮询数据。 - UnDiUdin

1

我正在开发一款类似的应用程序,其中我正在使用现有的Delphi应用程序与我的新.NET应用程序进行通信。我将该应用程序封装成DLL,并使用公开的函数从.NET调用,以及使用回调过程从.NET与Delphi进行通信。


0
作为其中一个选项,我可以提供我们的MsgConnect,它是一种轻量级的面向消息的中间件,可以轻松解决您的问题。MsgConnect适用于Delphi和C#。上面提到的RemObjects SDK也是一个很棒的产品,但对于您的简单任务可能有些过度。

0
你可以使用ZeroMQ。它是一个免费的面向消息的堆栈。

0

我的框架可以在Delphi和Visual Studio下运行,因此允许Win32和.NET应用程序通过原始TCP套接字进行通信。


0

您可以将您的C#代码转换为DLL(类库)。设置选项“使程序集COM可见”。创建新证书(如果需要)并签署您的代码。

在Windows中注册您的C# DLL:“RegAsm -tlb -codebase YourLibrary.dll”。

在Delphi中导入您的库(组件->导入组件,选择“类型库”,选择您的库,“创建单元”)。

在Delphi中使用与使用COM对象相同的方式使用您的C#库(例如OLE Automation或ActiveX)。

您可以为Delphi和C#之间的通信创建接口。 如果这样做,则可以轻松实现Delphi中的代码和C#中的代码之间的双向通信。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接