1

我正在尝试使用 pinvoke 将 C 结构编组为 C#。虽然我能够编组一个 intptr,但我找不到编组双指针的语法。在 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   ?? 
   }

我找不到任何关于如何标记的说明

4

2 回答 2

1

查看此描述以了解 IntPtr 是什么。您是否尝试过使用:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class xyz
{
    IntPtr np;
    IntPtr foo;
}
于 2013-09-03T12:24:24.230 回答
0

您似乎认为这IntPtr是一个指向int. 事实并非如此。AnIntPtr是一个与指针宽度相同的整数。IntPtrx86 上是 32 位宽,x64 上是 64 位宽。文档清楚地说明了这一切。

最接近的等效本机类型IntPtrvoid*无类型指针。

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

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

读取np引用 call的标量值Marshal.ReadInt32。并写它调用Marshal.WriteInt32. 但更有可能的是,因为这是一个指针,所以指针指向一个数组。在这种情况下,您使用适当的Marshal.Copy重载来读取和写入。

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

于 2013-09-03T12:40:58.140 回答