0

我有 C# 应用程序,它在加载时(在 Windows 上)在新线程上从非托管 C++ DLL 调用函数。此时它们作为并行线程运行并执行不同的任务。DLL 函数每隔一段时间将一些信息写入内存映射文件。我希望此函数在完成对 MMF 的写入后向 C# 应用程序发送通知。这个通知最好带有一些数字,但如果这使事情复杂化,则不是必须的。

编辑:

整个过程中发生的情况是 C++ 库正在执行一些繁重的计算任务,而 C# 应用程序是一个用作 GUI 的 WPF 项目,C++ 将其状态更新作为一个很长的参数向量发送,这打印到 MMF(似乎是一种快速且有条理的方式)。此信息应显示在 GUI 中。

在评论中,有人说使用 MMF 在这里不是一个好的做法,因为所有活动都是在同一个过程中执行的。我愿意就如何更好地计划此程序提出建议。

4

1 回答 1

2

您可以将委托作为回调函数传递给非托管函数,以便在完成时通知调用者(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。

于 2013-10-29T09:35:44.010 回答