我正在包装一个要从 .NET 使用的 C++ 库。C++ API 中有一些函数返回std::future
. 我想让 .NET 代理类返回System.Threading.Tasks.Task
。
我想在 C++ 端添加一个替换方法,除了方法参数之外,它还需要一个函数指针。然后我可以启动一个新线程(std::async
例如使用)并等待std::future::get
。一旦std::future::get
返回,我可以调用传入的函数指针。在 C# 方面,我会将 a 指针传递给将完成返回的任务的函数。就像是:
Task CallCpp(int a, int b) {
TaskCompletionSource<int> tcs;
Action callback = () => tcs.SetResult(0);
IntPtr callbackPtr = Marshal.GetFunctionPointerForDelegate(callback);
CppMethod(callbackPtr, a, b);
return tcs.Task;
}
[DllExport]
external void CppMethod(IntPtr callback, int a, int b);
void CppMethod(void (*callback)(), int a, int b) {
std::future f = realmethod(a, b);
std::async([&]{ f.get; callback(); });
}
std::future realmethod(int a, int b);
(是的,代码存在内存管理问题。不过应该足以理解这个想法)