【发布时间】:2018-03-15 05:26:29
【问题描述】:
我有一个静态 C 库,其中有非静态回调函数。注册此回调的客户端程序从摄像头获取视频数据。
现在我正在 C++/CLI 中为此编写 Wrapper(DLL)。这个 Wrapper Dll 将在 C# 应用程序中使用。
如何在 C++/CLI 中实现回调,以便 C# 代码可以注册它并从中获取视频数据。
【问题讨论】:
我有一个静态 C 库,其中有非静态回调函数。注册此回调的客户端程序从摄像头获取视频数据。
现在我正在 C++/CLI 中为此编写 Wrapper(DLL)。这个 Wrapper Dll 将在 C# 应用程序中使用。
如何在 C++/CLI 中实现回调,以便 C# 代码可以注册它并从中获取视频数据。
【问题讨论】:
在 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 就完成了。
【讨论】:
MyCallback 的指针传递给将要使用它的非托管类。