如何正确地将浮点指针从C库传递到它的C#包装器

how to properly pass a float pointer from a C library to its C# wrapper

本文关键字:包装 正确地 指针      更新时间:2023-10-16

我的自定义C库中有一个函数,它返回一个指向浮点值的指针。(这实际上是一个包含音频值的浮点数组)。

我想在Unity3d中使用这个C库(和返回的浮点数组),所以我正在为它编写一个C#包装器。我如何在C#脚本中正确导入/声明我的C函数?

我的C声明如下:

float*  getAudioBuffer(mySynth_t synth);

在C#中,我的猜测是,我应该将导入的函数声明为返回float[],如下所示:

[DllImport (dll)]
private static extern float[]  getAudioBuffer(  IntPtr synth)

这是正确的吗?我应该使用ref关键字吗?我应该在某个地方使用out关键字吗?我熟悉C++,但对C#一无所知,所以我并不真正理解mashalling等。

此外,浮点数组中的数据是音频数据,用于填充OnFilterRead中Unity3d的音频缓冲区。因此,这将被多次调用。任何关于最佳实践的提示、示例代码或指针都将不胜感激。

以下是我的操作方法:

[DllImport (dll)]
private static extern IntPtr  getAudioBuffer(  IntPtr synth);

然后使用它:

private float[] buffer = new float[1024];
void OnAudioFilterRead (float[] data, int channels)  
    {
         IntPtr buf = getAudioBuffer();
         Marshal.Copy(buf, buffer, 0, buffer.Length);
          int i, j;
           for ( i = 0, j=0; j < buffer.Length; i = i + channels, j++)
           { 
              data[i] = buffer[j];
              if (channels ==2)
                { data [i + 1] = data [i]; }
           }        
    }

任何关于如何更有效地做到这一点的提示都是受欢迎的。

一些好的读物:这里,这里,还有这里。