你能帮我解决一下这个问题吗?
我有一个C函数dll,它将由另一个C#应用程序调用.
我需要的功能之一如下:
我有一个C函数dll,它将由另一个C#应用程序调用.
我需要的功能之一如下:
struct DataStruct
{
unsigned char* data;
int len;
};
DLLAPI int API_ReadFile(const wchar_t* filename,DataStruct** outData);
我在C#中编写了以下代码:
class CS_DataStruct
{
public byte[] data;
public int len;
}
[DllImport("ReadFile.dll",CallingConvention = CallingConvention.Cdecl,CharSet = CharSet.Unicode)]
private static extern int API_ReadFile([MarshalAs(UnmanagedType.LPWStr)]string filename,ref CS_DataStruct data);
不幸的是,上面的代码不起作用……我想这是因为C func接受了DataStruct的指针指针,而我只是传递了CS_DataStruct的引用.
我可以知道如何将指向指针传递给C函数吗?如果不可能,有任何解决方法吗? (C API是固定的,因此无法将API更改为指针)
编辑:
DataStruct的内存将由c函数分配.在此之前,我不知道数据阵列应该有多大.
(感谢下面的评论)
解决方法
我使用了以下测试实现:
int API_ReadFile(const wchar_t* filename,DataStruct** outData)
{
*outData = new DataStruct();
(*outData)->data = (unsigned char*)_strdup("hello");
(*outData)->len = 5;
return 0;
}
void API_Free(DataStruct** pp)
{
free((*pp)->data);
delete *pp;
*pp = NULL;
}
访问这些函数的C#代码如下:
[StructLayout(LayoutKind.Sequential)]
struct DataStruct
{
public IntPtr data;
public int len;
};
[DllImport("ReadFile.dll",CharSet = CharSet.Unicode)]
unsafe private static extern int API_ReadFile([MarshalAs(UnmanagedType.LPWStr)]string filename,DataStruct** outData);
[DllImport("ReadFile.dll",CallingConvention = CallingConvention.Cdecl)]
unsafe private static extern void API_Free(DataStruct** handle);
unsafe static int ReadFile(string filename,out byte[] buffer)
{
DataStruct* outData;
int result = API_ReadFile(filename,&outData);
buffer = new byte[outData->len];
Marshal.copy((IntPtr)outData->data,buffer,outData->len);
API_Free(&outData);
return result;
}
static void Main(string[] args)
{
byte[] buffer;
ReadFile("test.txt",out buffer);
foreach (byte ch in buffer)
{
Console.Write("{0} ",ch);
}
Console.Write("\n");
}
现在数据安全地传输到缓冲区,应该没有内存泄漏.我希望它会有所帮助.