使用P / Invoke在托管代码和非托管代码之间共享内存

时间:2014-11-02 22:16:29

标签: c# .net pinvoke

我为C ++库创建了一个C包装器,我从C#托管代码中调用了这个C包装器。我面临的问题是这个库涉及数千次迭代和长时间运行。显然,我需要一种与C#程序通信的方法,并更新C / C ++库正在进行的处理的状态。

直接方法将在固定次数的迭代后返回,更新状态并再次调用C / C ++包装器。但是处理依赖于在每次迭代后更新的一些基于C ++ STL的数据结构。我在托管代码上不需要这些数据结构,但显然它们必须在内存中维护所有迭代。

所以我不能从C / C ++包装器返回,直到处理完成,否则C ++结构将被解除分配...

我认为最好的方法是在托管代码和非托管代码之间共享一些变量,并在每N次迭代中读取处理的状态。但这会导致另一个问题:如何同步访问此内存?

1 个答案:

答案 0 :(得分:1)

您可以在C ++代码中将C#委托注册为回调。这样您就不必从包装器返回,但是您的包装器可以通过回调调用C#委托,然后可以继续处理。您的委托还可以包含一些参数,您可以使用这些参数在C#和C ++层之间交换数据。

查看更完整的说明here

这里的主要技巧是使用方法GetFunctionPointerForDelegate,它允许您从C#委托中创建C ++函数指针,以便您可以从C ++层调用C#代码。