如何从C ++代码中引发事件并在另一个进程上调用C#代码中的处理程序?

时间:2015-02-25 22:54:00

标签: c# c++ wcf

我一直在努力做一些关于如何最好地沟通的阅读,看起来在不同语言中运行代码的非相关进程之间的通信方式通常是通过使用"命名管道。&# 34;

在C#中似乎通常在设置一些绑定时使用WCF以使用命名管道。但是,在C ++中,我应该直接创建一个命名管道,还是应该使用一些框架/库来创建命名管道?

此外,我还有哪些替代选项可以在C ++中创建C#应用程序可以听到的事件?

2 个答案:

答案 0 :(得分:0)

在Windows中有一个number of IPC mechanisms可供选择。

评估了其中的一些之后,确实是一个决定哪一个对您的用例具有最小缺点的案例。我已经将命名管道用于C#到C ++的消息系统,我仍然不确定我做出了正确的选择。

也就是说,如果您只是正在查看信号事件(并且不需要包含状态),shared mutex可能是一个轻量级替代方案。

编辑:我的意思是说如果你选择命名管道,你需要使用自定义解决方案。使用WCF意味着对WCF消息传递格式进行逆向工程,并在C ++中重新实现它。

答案 1 :(得分:-1)

命名管道

按照你的问题标题

  

如何从C ++代码中引发事件,以及在另一个进程的C#代码中调用处理程序

...所以我假设您想要一种类型的订阅模型,当事件被触发时会自动调用您的处理程序。

你的第一个身体:

  

我一直在努力做一些关于如何最好地沟通的阅读,看起来在不同语言中运行代码的非相关进程之间的通信方式通常是通过使用“命名管道”。

......好吧,它可以在命名管道传输上完成,但是您需要转换原始传入数据并通过路由机制传递它以实际触发事件。命名管道只是发送原始数据的低级IPC。这不是订阅模式。 它不会以与共享内存不同的方式调用和调用代码中的处理程序。因此,如果您希望通过原始命名管道订阅c ++中的某些内容并将其调用到您的c#处理程序中,那么与COM(下面)相比,它需要您做更多的工作。

  

但是,在C ++中,我应该直接创建一个命名管道,还是应该用一些框架/库来创建命名管道?

在c ++中,自己创建命名管道相对容易。在C#中,您可以使用NamedPipeClientStream

COM

  

此外,我还有哪些替代选项可以在C ++中创建C#应用程序可以听到的事件?

再次,保持您的订阅和“呼叫处理程序”需求我会推荐COM而不是其他IPC技术。

在c ++中,您可以创建一个COM对象,该对象将触发可以在同一个/另一个进程中接收的COM events

MSDN将COM定义为:

  

Microsoft组件对象模型(COM)是一个独立于平台,分布式,面向对象的系统,用于创建可以交互的二进制软件组件。

在c#中,您可以订阅这些事件,并在事件发生时得到通知。

对于本地机器IPC,使用命名管道或COM通常比WCF更有效,因为后者施加了开销 - 特别是数据的编码方式。

告诉我更多

有关IPC see my answer to this SO question here

的更多比较