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

Posted

技术标签:

【中文标题】如何从 C++ 代码引发事件并在另一个进程的 C# 代码中调用处理程序?【英文标题】:how to raise events from C++ code and call handlers in C# code on another process? 【发布时间】:2015-02-25 22:53:59 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

命名管道

按照你的问题标题

如何从 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

【讨论】:

COM 对象是只有 Windows 的东西吗?它们似乎与语言无关,所以我认为它们与操作系统无关。是这样吗? Windows 仅据我所知。是的,COM 是一种二进制协议,并且与语言无关,但底层的 COM 系统本质上是仅限于 Windows 的。 Tell me more

以上是关于如何从 C++ 代码引发事件并在另一个进程的 C# 代码中调用处理程序?的主要内容,如果未能解决你的问题,请参考以下文章

跨 c#、c++ 和可能更多语言的进程间发布/订阅模型

轻轻杀死一个进程

C++ 到 C# 事件处理

c# 为自定义控件添加鼠标双击事件

如何从 CUDA C++ 创建和使用动态库“.so”并在 Linux 环境 (CentOS) 下的 C# 代码中使用它?

从 C# 模块调用 C++ 函数会引发随机崩溃