簡體   English   中英

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

[英]Using external C++ library with C#

我正在嘗試在我的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);

我嘗試在主要方法中使用此功能來測試庫:

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

您還需要安排外部代碼為要返回的非托管內存導出解除分配器。 否則,您最終將泄漏此內存。

我假設你正在設法通過一項heatmap_t*中的第一個參數正確Render_default_to 我們看不到您的任何代碼可以執行此操作,因此您也可能會出錯是完全合理的。 這可能會導致類似的運行時錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM