加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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更改为指针)

编辑:
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");
}

现在数据安全地传输到缓冲区,应该没有内存泄漏.我希望它会有所帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读