我正在尝试在我的c#项目中包含一个外部C ++库。 这是我想要使用的函数的原型:
unsigned char* heatmap_render_default_to(const heatmap_t* h, unsigned char* colorbuf)
此函数为colorbuf分配内存:
colorbuf = (unsigned char*)malloc(h->w*h->h * 4);
的PInvoke:
[DllImport(DLL, EntryPoint = "heatmap_render_default_to", CallingConvention = CallingConvention.Cdecl)]
public static extern byte[] Render_default_to(IntPtr h, byte[] colorbuf);
我尝试在main方法中使用此函数来测试库:
var colourbuf = new byte[w * h * 4];
fixed (byte* colourbufPtr = colourbuf)
HeatMapWrapper.NativeMethods.Render_default_to(hmPtr, colourbuf);
当我尝试这个时,我得到了一个Segmentation fault异常。 有人可以帮我这个吗?
答案 0 :(得分:1)
您需要手动编组返回值。将其声明为IntPtr
:
[DllImport(DLL, EntryPoint = "heatmap_render_default_to",
CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr Render_default_to(IntPtr h, byte[] colorbuf);
您可以使用Marshal.Copy
复制缓冲区:
IntPtr buffPtr = Render_default_to(...);
var buff = new byte[w * h * 4];
Marshal.Copy(buffPtr, buff, 0, buff.Length);
您还需要安排外部代码为正在返回的非托管内存导出解除分配器。否则你最终会泄漏这个记忆。
我假设您正在heatmap_t*
的第一个参数中正确传递Render_default_to
。我们无法看到您的任何代码,并且您也遇到了错误也是完全可信的。这可能会导致类似的运行时错误。