在C++(MFC)应用程序和C#之间传递数据
Passing data between C++ (MFC) app and C#
我们有一个单片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,仍然需要在出现故障的情况下运行,但这是特定于我的需求,最好是最大限度地部署。
- 在cuda线程之间共享大量常量数据
- 在c代码之间共享数据的最佳方式
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 线程之间的实时数据共享
- std::weak_ptr 和相应的 std::shared_ptr 之间是否存在数据竞争?
- 在C++事务之间存储大量字符数据的有效方法
- 如何在进程之间共享大量数据而不重复?(国际刑罚委员会)
- 简单使用 std::atomic 在两个线程之间共享数据
- 在 EXE/DLL 之间传递数据
- 如何在自定义 LLVM 传递之间正确传递数据结构
- 如何使用gRPC在客户端和服务器之间双向发送和接收流元数据
- 读取USB与操作系统、C++之间传输的数据
- C++ 中的类之间的数据重新循环 - 错误:'<class name>'未在此范围内声明
- 如何在tensorflow中在gpu和cpu之间拉/推送数据
- 在C++和Python之间交换数据的最快方法是什么?
- C++ - 比较模板和类之间的数据类型
- 如何在Qt中预先建立的窗口之间传递数据?
- 包括数据类型之间的斗争