我有一个 DLL,它导出一个返回 float* 的函数,我想在我的 C# 代码中使用它。我不知道如何编组我的 float* 以便我可以在 C# 中安全地使用它。因此,在我的 C++ DLL 中,我声明:
static float* GetSamples(int identifier, int dataSize);
在我的 C# 脚本中,我有:
[DllImport ("__Internal")]
public static extern float[] GetSamples (int identifier, int dataSize);
C++ GetSamples(int,int) 分配内存并返回浮点数组的指针。如何声明 C# GetSamples 以编组我的浮点数组,以及如何访问数据(通过迭代或 Marshal.Copy)?另外,我可以从 C# 中删除 float* 还是必须调用另一个 C++ 函数来删除分配的内存?
编辑:所以这是我到目前为止所尝试的。首先,在 C# 方面:
宣言:
[DllImport ("__Internal")]
public static extern int GetSamples ([In, Out]IntPtr buffer,int length, [Out] out IntPtr written);
试图调用它:
IntPtr dataPointer = new IntPtr();
IntPtr outPtr;
GetSamples(dataPointer, data.Length, out outPtr);
for (var i = 0; i < data.Length; i++){
copiedData[i] = Marshal.ReadByte(dataPointer, i);
}
然后在我的 C++ 库中:
int AudioReader::RetrieveSamples(float * sampleBuffer, size_t dataLength, size_t * /* out */ written)
{
float* mydata = new float[dataLength];
//This is where I copy the actual data into mydata
memcpy(sampleBuffer, mydata, dataLength*sizeof(float));
delete data;
return dataLength;
}
我真的不知道 outPtr 的用途...而且我知道我还有一些可以删除的额外复制步骤,我只想让它现在工作。