【问题标题】:Wrapping C callback in C++/CLI在 C++/CLI 中包装 C 回调
【发布时间】:2018-03-15 05:26:29
【问题描述】:

我有一个静态 C 库,其中有非静态回调函数。注册此回调的客户端程序从摄像头获取视频数据。

现在我正在 C++/CLI 中为此编写 Wrapper(DLL)。这个 Wrapper Dll 将在 C# 应用程序中使用。

如何在 C++/CLI 中实现回调,以便 C# 代码可以注册它并从中获取视频数据。

【问题讨论】:

标签: c++ c++-cli


【解决方案1】:

在 C++/CLI 中,您可以使用静态函数(带有原生 C 签名,可以作为 C 库的回调),调用托管委托:

// MyDispatcherClass.h
#pragma once

public delegate void MyDelegateType();

public ref class MyDispatcherClass
{
public:
    static MyDelegateType^ MyDelegate;
};

static void MyCallback(/*...*/)
{
    if (MyDispatcherClass::MyDelegate != nullptr)
        MyDispatcherClass::MyDelegate(/* do some type mapping here if needed */);
}


// MyDispatcherClass.cpp: 
#include "stdafx.h"
#include "MyDispatcherClass.h"

所以在你的 C 库中注册 MyCallback,将你的 C# 委托注册到 MyDispatcherClass::MyDelegate 就完成了。

【讨论】:

  • @Doc Brown: How To call Delegate in C#. Can you please give some example code for that
  • 不知道这是如何工作的 - 我立即收到错误消息“托管类型或函数不能在非托管函数中使用”,正如预期的那样。如果我能让它轻松工作,我会投票赞成......
  • @RayKoopa:现在,我创建了一个 C++/CLI 演示项目,并直接从 Visual Studio 复制了您可以在我的答案中看到的代码(直到现在还缺少一个“;”)。这编译得很好!也许您试图将这个托管类直接包含在一些非托管代码中?这行不通,您将需要一些额外的(托管)初始化代码,其中将指向MyCallback 的指针传递给将要使用它的非托管类。
  • 在 C++ CLI 项目中尝试过,托管代码在该部分中...我可以稍后在新项目中尝试,但我仍然不知道这将如何工作经验。
  • @RayKoopa:我可以向你保证,这很好用,在收到你的评论后,昨天用 VS 2017 进行了尝试。自 2009 年以来,我在一个更大的项目中使用了这种技术,并且它适用于介于两者之间的所有 VS 版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
相关资源
最近更新 更多