我有一個DLL導出函數返回一個float *,我想在我的C#代碼中使用它。我不知道如何編組我的float *,以便我可以在C#中安全地使用它。 所以,在我的C++ DLL,我宣佈:元帥float *到C#
static float* GetSamples(int identifier, int dataSize);
在我的C#腳本,我有:
[DllImport ("__Internal")]
public static extern float[] GetSamples (int identifier, int dataSize);
的C++ GetSamples(INT,INT)分配內存,並返回一個指針t時的浮點數組。我如何聲明C#GetSamples來編組我的float數組,以及如何訪問數據(通過迭代或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++的lib:
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是什麼...我知道我有一些額外的複製步驟,我可以刪除,我只是想讓它現在工作。
您是否控制該DLL的代碼? – usr
是的,我確實控制了DLL的代碼 –