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

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

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

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

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

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

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

拿你的选择:

  • 命名管道< - 我的建议
  • 共享内存
  • sockets
  • 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需要更多的程序员开销,但它很好,因为您可以定义更丰富的接口,并避免必须将复杂的消息转换为二进制forms。 如果你走这条路,CoRegisterClassObject是通过DCOM发布对象的起点。 我从来没有试过从C#应用程序这样做,但原则上它应该是完全可能的

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

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

我目前正在使用COM来添加一些.NET组件function,主要是因为如果不存在.NET,仍然需要使用回退function,但这特别适合我需要最大部署的情况。