C++ 到 C# 事件处理

Posted

技术标签:

【中文标题】C++ 到 C# 事件处理【英文标题】:C++ to C# event handling 【发布时间】:2011-09-30 10:42:05 【问题描述】:

所以我得到了我的 C# WinForm 应用程序,我从中调用了我的 C++ CLI MFC dll 库。

但我的 C++ 库中有一些事件,即使这些事件发生在该库的本机(非 CLI)部分。我需要从我的 C# 应用程序中调用一些代码,并在此事件中获取一些数据。

所以当从客户端调用这个原生函数时:

bool __stdcall ClassName::WorkQuery()

         ......
        switch(pp->code)
        
        case READCOMPLEX:
                       ..........

我需要从 C# 中获取数据所以我需要以某种方式将其注册为事件。

【问题讨论】:

您的活动是什么样的?我认为事件是 .Net 的东西,而不是 C++ 的东西......你有任何可以分享的示例代码签名吗? 所以我的原生 C++ 部分的工作方式与运行服务器类似(甚至不是我的代码),并且有标准 C++ 函数在客户端请求某些数据时调用。 那么“事件”是什么意思?这是某种应该像活动一样运作的公共财产吗?如果是这样,你可以分享它的签名吗?还是您只是想以某种方式找出某个 C++ 函数何时被调用(内部)? 我只想从这个函数调用 C# 部分而不处理这个函数本身,我什至不确定这是否可以处理原生 C++ 函数。我称之为它甚至只是因为它发生在随机时间。 c++/cli pass (managed) delegate to unmanaged code 的可能重复项 【参考方案1】:

所以问题是您需要运行 C# 代码来响应 MFC 事件(或 C++ 回调),对吗?

您为什么不能只向本机事件/回调注册一个本机处理程序,然后它只调用一个 .NET 事件,该事件可以从 C# 中使用。

【讨论】:

+1;这个答案似乎是一个很好的解决方案。也许代码示例是有序的【参考方案2】:

您可以从 C++/CLI 事件句柄创建一个 .NET 事件,然后在本机使用它。只需使用 EventWaitHandle 或派生的 AutoResetEvent 和 ManualResetEvent。

【讨论】:

不,我已经有了一个函数,当有事情发生时会调用它,我怎样才能将事件附加到它? 您将事件与事件混淆了。在非托管的 WIN32 世界中,事件是发生某事的通知,不要与 C#“事件”对象混淆。 EventWaitHandle 是 WIN32 事件的 C# 版本,可用于监听原始事件,然后调用您的 C#“事件”。 @MahmoudAl-Qudsi:我很确定你是一个让事件与事件混淆的人。这个问题对内核事件没有任何要求。

以上是关于C++ 到 C# 事件处理的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中触发事件并在 C# 中处理它们

在 C++ 中处理 C# COM 事件

从 C# 到 C++ 触发 COM 事件的正确方法是啥

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

c++或者C 语言中有没有类似C#中事件委托的机制

使用继承处理跨项目事件