您可以将委托作为回调函数传递给非托管函数,以便在完成时通知调用者(C# 应用程序)。
使用这样的 C++ 函数
void SetFinishedCallback(void (*callback)(bool success));
然后使用 C# 导入函数
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void FinishedDelegate([MarshalAs(UnmanagedType.U1)]bool success);
[DllImport("unmanaged.dll")]
private static extern void SetFinishedCallback(FinishedDelegate callback);
您应该能够使用调用该函数
SetFinishedCallback(MyFuncAcceptingBool);
编辑:原则上您可以传递整个计算结果,而不是传递一个布尔值来指示成功/失败,而不再需要 MMF。这引发了编组问题,因为您必须将数据从非托管代码传递到托管代码。如果您有一个简单的数据结构(例如字节数组),那将很容易。
在 C++ 中使用
void SetFinishedCallback(void (*callback)(void* data, int length));
在 C# 中使用
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void FinishedDelegate(IntPtr data, int length);
您必须在回调方法中手动转换 IntPtr。