在C++(MFC)应用程序和C#之间传递数据

Passing data between C++ (MFC) app and C#

本文关键字:之间 数据 应用程序 C++ MFC      更新时间:2023-10-16

我们有一个单片MFC GUI应用程序,它在C++中的使用寿命即将结束。我们计划在C#中构建新功能,并在每个应用程序之间传递数据。

问题是:在C++和C#之间传递数据的最佳方法是什么?

注意:
两端都有一个GUI前端,可能只需要传递像Id这样的简单数据,并且可能有一个机制,它可以向其他应用程序指示要使用的流程/功能
例如,其中一个应用程序将是C#中的CRM系统,当双击网格中的一行时,它会在MFC应用程序的客户窗体中传递customerId和打开该客户的消息。

我做了一点研究,选项似乎是Windows消息、内存映射、命名管道或类似Windows套接字的东西。在这个阶段,我们倾向于命名管道,但非常感谢其他建议或提示或其他人的经验。

就我个人而言,我会考虑使用类似命名管道的东西,因为它们很容易从C++端使用,也很容易在.NET端使用System.IO.pipes。

如果你计划随着时间的推移替换应用程序的其他非.NET部分,这也是阻力可能最小的路径。

选择:

  • 文件
  • 命名管道<--我的推荐
  • 共享存储器
  • 插座
  • COM
  • Windows消息

为什么命名管道?

  • 为您提供一种免费的FIFO工作方式(类似于套接字,但不类似于共享内存)
  • 可以轻松地双向交流
  • 在所有平台上都得到良好支持
  • 易于使用
  • 可靠的数据传递和交付
  • 可以是阻塞和非阻塞
  • 可以在不移除的情况下读取数据(与套接字不同)
  • 可以轻松扩展到包括第三个应用程序

在.Net中,只需使用System.IO.Pipes.

在C++中,使用CreateNamedPipe和CreateFile。

您还可以从托管端使用p/Invoke-如果MFC应用程序具有C API,这将非常有用。您也可以从任意一侧使用COM。

您列出的选项当然有效,但您也可以考虑COM.

我会使用套接字(TCP)-MFC和.NET都直接支持它们。

您真的需要两个进程吗?

非托管C++和托管C#代码完全能够在同一个进程中运行,并且通过一小层托管C++/CLI,您可以用简单的函数调用来取代进程间通信的复杂性。

我选择的是标准窗口消息(例如WM_FOO)或DCOM:

  • 只要通信非常简单,并且设置它的开销最小,消息就可以工作。如果您可以将通信简化为每条消息一到两个整数,那么这可能是一个很好的起点。如果这两个应用程序都已经是窗口应用程序,那么它们都已经有了消息循环,所以你已经完成了大部分工作。

  • DCOM需要更多的程序员开销,但它很好,因为你可以定义一个更丰富的接口,并避免将复杂的消息转换为二进制形式。如果你走这条路,CoRegisterClassObject是通过DCOM发布对象的起点。我从未尝试过在C#应用程序中这样做,但原则上它应该是完全可能的

假设您拥有遗留应用程序的源代码,看看是否不能将所有"主力"代码编译为DLL,然后从那里调用各个函数/窗口。一旦你完成了这项工作,你就可以简单地围绕你需要的函数编写托管C++包装器,并从你的C#代码中调用它们。如果幸运的话,整个过程可能只需要不到一天的时间。

如果你不必担心应用程序运行的所有系统上都存在.NET框架,那么我会说C++/CLI,否则就是COM。不过,这真的取决于你最舒服、最熟悉的是什么。我喜欢现有的C++/CLI和COM的"函数调用"结构(而不是用其他协议构建它),但这只是我自己。

我目前正在使用COM添加一些.NET组件功能,主要是因为如果没有.NET,仍然需要在出现故障的情况下运行,但这是特定于我的需求,最好是最大限度地部署。