gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:49:22 26 4
gpt4 key购买 nike

我正在尝试在我的 C# 项目中包含一个外部 C++ 库。这是我要使用的函数的原型(prototype):

 unsigned char* heatmap_render_default_to(const heatmap_t* h, unsigned char* colorbuf)

此函数正在为 colorbuf 分配内存:

colorbuf = (unsigned char*)malloc(h->w*h->h * 4);

平沃克:

[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);

当我尝试这个时,我得到了一个段错误异常。有人可以帮我解决这个问题吗?

最佳答案

您将需要手动整理返回值。将其声明为 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);

您还需要安排外部代码为返回的非托管内存导出一个释放器。否则你最终会泄漏这段内存。

我假设您正在设法在 Render_default_to 的第一个参数中正确传递 heatmap_t*。我们看不到您执行此操作的任何代码,而且您也完全有可能弄错了。这可能会导致类似的运行时错误。

关于c# - 在 C# 中使用外部 C++ 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35577060/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com