获取从非托管代码到托管代码的值
本文关键字:托管代码 非托管代码 获取 | 更新日期: 2023-09-27 18:35:53
我需要从C
非托管代码中获取值。实际上我从非托管调用了该函数,该函数的返回类型是 point,其中 point 是一个结构。
结构引用方式如下
typedef struct point
{
Poly* pol;
NL_DEGREE p;
VECTOR* vec;
} Point;
其中Poly
和VECTOR
是结构。
实际上,我在C#
中得到了IntPtr
返回值点。得到IntPtr
的值后,我试着把这个Intptr
转换成一个Array
。按以下方式转换Array
。
point[] Q = new point[2];
int size= Marshal.SizeOf(new point());
for (int i = 0; i < 2; i++)
{
Q[i] = (point)Marshal.PtrToStructure(new IntPtr(Qptr.ToInt32() + (i * size)), typeof(point));
}
但是在获取数组后,每个结构元素的值变为 null。我在这方面做错了什么,请任何人建议我......
我在下面详细介绍了用 c# 创建的结构。
public unsafe struct point
{
public Poly* pol;
public NL_DEGREE p;
public vECTOR* knt;
}
其中聚
public unsafe struct Poly
{
public Int32 n;
public cpoint* Pw;
}
硬币也是一种结构
public struct cpoint
{
public double x;
public double y;
public double z;
public double w;
}
其中矢量
public unsafe struct VECTOR
{
public Int32 m;
public double *U;
}
从你的代码片段来看,不清楚结构在 C 中是如何定义的。 假设某些默认对齐方式,C# 定义应如下所示:
public class Point
{
IntPtr pol;
NL_DEGREE p;
IntPtr vec;
}
您仍然必须考虑具有适当包装尺寸的确切结构布局(有关详细信息,请参见 1)
因此,在您的代码中,您必须执行以下操作:
var point = (Point)Marshal.PtrToStructure(ptr, typeof(Point));
var poly = (Poly)Marshal.PtrToStructure(point.pol, typeof(Poly));
var vector = (Vector)Marshal.PtrToStructure(point.vec, typeof(Vector));
由于Poly和Vector都可能是数组,因此您可能希望使用IntPtr.Add() 2方法来迭代这些数组。
结构布局属性.包字段
IntPtr.Add