如何在c#中访问编组结构数据的指针?

时间:2011-10-20 04:22:45

标签: c# c

我正在将“非托管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等。

我是初学者!你能取悦我吗?

1 个答案:

答案 0 :(得分:3)

您需要在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));

要检索链接或空白数据,您还需要拨打Marshal.PtrToStructure