我正在尝试使用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的任何说明
答案 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
来访问内容。