获取从非托管代码到托管代码的值

本文关键字:托管代码 非托管代码 获取 | 更新日期: 2023-09-27 18:35:53

我需要从C非托管代码中获取值。实际上我从非托管调用了该函数,该函数的返回类型是 point,其中 point 是一个结构。

结构引用方式如下

typedef struct point
{
    Poly* pol;
    NL_DEGREE p;
    VECTOR* vec;
} Point;

其中PolyVECTOR是结构。

实际上,我在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