C#调用C DLL传递指针到指针的参数
发布时间:2020-12-15 08:07:50 所属栏目:百科 来源:网络整理
导读:你能帮我解决一下这个问题吗? 我有一个C函数dll,它将由另一个C#应用程序调用. 我需要的功能之一如下: struct DataStruct{ unsigned char* data; int len;};DLLAPI int API_ReadFile(const wchar_t* filename,DataStruct** outData); 我在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更改为指针) 编辑: 解决方法
我使用了以下测试实现:
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"); } 现在数据安全地传输到缓冲区,应该没有内存泄漏.我希望它会有所帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |