【发布时间】:2014-10-24 07:56:36
【问题描述】:
我有这样的层:C# 主应用程序 -- C++ 库的 CLI/C++ 包装器 -- C++ 库。
由于 C#-C++ 互操作性的限制,编写了 CLI 中间层。我还用它从 C# 的角度打磨了一些粗糙的边缘——换句话说,中间层允许隐藏 C/C++ 类型(如 char*)并进行所有必要的转换。
我未能进行的一个转换是传递回调。我尝试像 Pass a c++ lambda to old c function pointer 那样做,但我不能将 lambda 作为回调传递。
C++ 回调定义:
typedef void (*CppOnEngineCloseCallback)
(void * customParam, const wchar_t * errorMessage);
我知道customParam没有被使用,所以我为中间层(CLI/C++)定义了这样的回调:
typedef void (*CLIOnEngineCloseCallback)
( String ^ errorMessage);
在包装器中我创建了这样的 lambda:
// lambda signature should resemble CppOnEngineCloseCallback
auto lambda = [&] (void * customParam, const wchar_t * errorMessage) {
cli_callback(Marshal::PtrToStringUni( IntPtr(static_cast<void*>(
const_cast<wchar_t*>(errorMessage)))));
};
我担心cli_callback 是否会在 CLI 环境中正确保存(这是我的第一个项目)——毕竟我在时间 A 传递它,并在时间 B 使用它。
编译器更加担心,因为当我尝试使用 lambda 时:
InitEngine( // C++ function that requires callback
&lambda);
它说它无法将lambda 转换为CppOnEngineCloseCallback。
首先可行吗?怎么样?
【问题讨论】:
标签: c# visual-c++ lambda c++-cli