如何在c#中访问结构数据的封送指针

本文关键字:数据 指针 结构 访问 | 更新日期: 2023-09-27 18:11:52

我正在将'非托管c'代码封送到下面给出的c#代码中。

    [DllImport("ContainerDll.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern IntPtr NodeSearch(IntPtr firstNode, string key);
    IntPtr firstNode = IntPtr.Zero;
    private void button4_Click(object sender, EventArgs e)
    {
        IntPtr ret = NodeSearch(firstNode, "key_string");
    }
    //NodeSearch method will be called which is present in 'ContainerDll.dll'
    //pointer to structure will be returned.
    //my c-structure contains these fields. 
    //        typedef struct container
    //        {
    //             char Name[20];
    //             void *VoidData;
    //             struct container *Link;
    //        }       
    //             Node;

我的'IntPtr'类型的c#变量'ret'现在得到了指向这个结构体的指针。它有从'NodeSearch'方法返回的地址。

如何访问这个c#表单应用程序(也在控制台应用程序)?

我想我不能这样使用:ret->Name[0], ret->VoidData等

我是初学者!你能让我高兴吗?

如何在c#中访问结构数据的封送指针

您需要在c#中创建一个兼容的struct定义,并使用Marshal类封送指向该结构体的指针。

结构体定义可能如下所示:

[StructLayout(LayoutKind.Sequential)]
struct Container
{
    [MarshalAs(UnmanagedType.ByValTStr, CharSet = CharSet.Ansi, SizeConst = 20)]
    string Name;
    IntPtr VoidData;
    IntPtr Link
}
然后,您应该能够以类似于以下方式封送指向该结构体的指针:
var ret = NodeSearch(IntPtr.Zero, "key_string");
var retContainer = (Container)Marshal.PtrToStructure(ret, typeof(Container));

为了检索链接或void数据,您还需要调用Marshal.PtrToStructure