【发布时间】:2016-02-02 14:07:17
【问题描述】:
我们正在使用 PInvoke 在 C# 和 C++ 之间进行互操作。
我有一个如下的互操作结构,另一侧有一个相同的布局 C++ 结构。
[StructLayout(LayoutKind.Sequential)]
public struct MeshDataStruct : IDisposable
{
public MeshDataStruct(double[] vertices, int[] triangles , int[] surfaces)
{
_vertex_count = vertices.Length / 3;
_vertices = Marshal.AllocHGlobal(_vertex_count*3*sizeof (double));
Marshal.Copy(vertices, 0, _vertices, _vertex_count);
}
// .. extract data methods to double[] etc.
private IntPtr _vertices;
private int _vertex_count;
public void Dispose()
{
if (_vertices != IntPtr.Zero)
{
Marshal.FreeHGlobal(_vertices);
_vertices = IntPtr.Zero;
}
}
}
现在我想添加第二个 ctor
public MeshDataStruct(bool filled_in_by_native_codee)
{
_vertex_count = 0;
_vertices = IntPtr.Zero;
}
然后在 C++ 中编写一个允许 C++ 填充数据的方法。这将允许我们对输入和输出数据使用相同的结构...
但是,据我了解,AllocHGlobal 在 C# 和 C++/Cli 中可用,但不是纯 C++。
所以我的问题是:如何在 C++ 中分配内存,以便我可以通过调用 Marshal.FreeHGlobal(...) 在 C# 端安全地释放它?
【问题讨论】:
-
使用 Windows API
GlobalAlloc、LocalAlloc函数和堆函数:msdn.microsoft.com/en-us/library/windows/desktop/…。此外,我不建议让两种不同的语言尝试弄清楚每种语言如何分配或取消分配内存。让每种语言负责自己的内存,唯一可能的例外是使用我之前提到的 Windows API 堆分配函数。
标签: c# c++ interop pinvoke marshalling