如何编组双指针?

时间:2013-09-03 12:17:44

标签: c# c pointers pinvoke marshalling

我正在尝试使用pinvoke将C结构编组为C#。虽然我能够编组一个intptr我找不到编组双指针的语法。 int指针和双指针都在C端使用,以分配一个int或double的数组。

这是C结构:

struct xyz
{
      int *np;  // an int pointer works fine
      double *foo;
};

这是c#类:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class xyz
{
    Intptr np;  // works fine
            // double *foo   ?? 
   }

我无法找到关于如何使用marc的任何说明

2 个答案:

答案 0 :(得分:1)

结帐this description for what an IntPtr is。你尝试过使用过:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class xyz
{
    IntPtr np;
    IntPtr foo;
}

答案 1 :(得分:0)

您似乎认为IntPtr是指向int的指针。事实并非如此。 IntPtr是一个与指针宽度相同的整数。所以IntPtr在x86上是32位宽,在x64上是64位宽。 documentation使这一切清楚。

IntPtr最接近的等效本机类型是void*,这是一种无类型指针。

所以你在C#中的课应该是:

[StructLayout(LayoutKind.Sequential)]
public class xyz
{
    IntPtr np;
    IntPtr foo;
}

要阅读np引用的标量值Marshal.ReadInt32。并写下来Marshal.WriteInt32。但更可能的是,由于这是一个指针,指针指向一个数组。在这种情况下,您使用适当的Marshal.Copy重载来读写。

对于指向double的指针,如果值是标量,则Marshal中没有方法可以读取或写入值。但同样,它肯定是一个数组,在这种情况下使用Marshal.Copy来访问内容。