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

时间:2008-10-08 20:38:34

标签: c# c++ ipc

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

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

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

我做了一些研究,选项似乎是Windows Messaging,Memory Mapping,Named Pipes或Windows Sockets之类的东西。在这个阶段,我们倾向于命名管道,但非常感谢其他建议或提示或其他人的经历。

9 个答案:

答案 0 :(得分:5)

就我个人而言,我会考虑使用像命名管道这样的东西,因为它们很容易在C ++端和.NET端的System.IO.Pipes上使用。

如果您计划随着时间的推移替换应用程序的其他非.NET位,那么它也可能是阻力最小的路径。

答案 1 :(得分:5)

选择:

  • files
  • 命名管道< - 我的推荐
  • 共享内存
  • 插座
  • COM
  • Windows消息

为什么命名管道?

  • 为您提供免费的FIFO工作方式(如套接字,但不像共享内存)
  • 可以轻松地双向沟通
  • 在所有平台上得到良好支持
  • 易于使用
  • 可靠的数据传递和传递
  • 可以阻止和阻止
  • 无需删除即可读取数据(与套接字不同)
  • 可以轻松扩展为包含第三个应用程序。

在.Net中只使用System.IO.Pipes。

在C ++中使用CreateNamedPipe和CreateFile。

答案 2 :(得分:2)

您也可以使用管理端的P / Invoke - 如果MFC应用程序具有C API,这将非常有用。你也可以从任何一方使用COM。

答案 3 :(得分:2)

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

答案 4 :(得分:2)

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

答案 5 :(得分:1)

你真的需要两个流程吗?

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

答案 6 :(得分:0)

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

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

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

如果您不必担心应用程序将运行的所有系统上存在的.NET框架,我会说C ++ / CLI,否则就是COM。但这确实取决于你最熟悉和熟悉的东西。我喜欢C ++ / CLI和COM的现有“函数调用”结构(而不​​是使用其他协议构建它),但这只是我。

我目前正在使用COM来添加一些.NET组件功能,主要是因为如果不存在.NET,仍然需要使用回退功能,但这是特定于我需要最大部署的首选。