在C#中使用外部C ++库

时间:2016-02-23 12:00:08

标签: c# c++ .net pinvoke

我正在尝试在我的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异常。 有人可以帮我这个吗?

1 个答案:

答案 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。我们无法看到您的任何代码,并且您也遇到了错误也是完全可信的。这可能会导致类似的运行时错误。