繁体   English   中英

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

[英]how to raise events from C++ code and call handlers in C# code on another process?

我一直在尝试阅读一些有关如何最好地进行通信的文章,并且看来在运行不同语言的代码的不相关进程之间进行通信的方法通常是使用“命名管道”。

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

另外,我还必须使用哪些其他选项在C ++中创建C#应用程序可以听到的事件?

Windows中有许多IPC机制可供选择。

在评估了其中的一些情况之后,实际上是确定哪种情况对您的用例不利的情况最小。 我已经将命名管道用于C#到C ++消息传递系统,但仍不确定我是否选择了正确的管道。

就是说,如果您查看信号事件(并且不需要包含状态),则共享互斥体可能是轻量级的选择。

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

命名管道

按照您的问题标题

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

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

您的第一个身体:

我一直在尝试阅读一些有关如何最好地进行通信的文章,并且看来在运行不同语言的代码的不相关进程之间进行通信的方法通常是使用“命名管道”。

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

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

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

通讯

另外,我还必须使用哪些其他选项在C ++中创建C#应用程序可以听到的事件?

同样,为了满足您的订阅和“呼叫处理程序”的需求,我建议使用COM而不是其他IPC技术。

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

MSDN将COM定义为:

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

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

与WCF相比,使用本地计算机IPC的命名管道或COM通常比WCF更为有效,这是因为WCF施加了额外的开销,尤其是编码数据的方式。

告诉我更多

有关IPC的更多比较, 请参见我对此SO问题的回答。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM