如何封送双指针
本文关键字:指针 何封送 | 更新日期: 2023-09-27 18:30:05
我正在尝试使用pinvoke将C结构封送到C#。虽然我可以封送intptr,但我找不到封送双指针的语法。在C端同时使用int指针和double指针来分配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 ??
}
我找不到任何关于如何进行的说明
查看IntPtr的描述。您是否尝试过使用:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class xyz
{
IntPtr np;
IntPtr foo;
}
您似乎认为IntPtr
是指向int
的指针。事实并非如此。IntPtr
是一个与指针宽度相同的整数。所以IntPtr
在x86上是32位宽,在x64上是64位宽。文件清楚地说明了这一切。
与IntPtr
最接近的等效本机类型是void*
,一个非类型化指针。
所以你的C#课程应该是:
[StructLayout(LayoutKind.Sequential)]
public class xyz
{
IntPtr np;
IntPtr foo;
}
为了读取np
引用的标量值,请调用Marshal.ReadInt32
。并将其编写为Marshal.WriteInt32
。但更有可能的是,由于这是一个指针,指针指向的是一个数组。在这种情况下,您可以使用适当的Marshal.Copy
重载进行读取和写入。
对于指向double的指针,如果该值是标量,则Marshal
中没有读取或写入该值的方法。但是,它肯定是一个数组,在这种情况下使用Marshal.Copy
来访问内容。