编组指向类型数组的指针(托管C# - >非托管C ++)

时间:2009-08-24 15:55:19

标签: c# pointers double unmanaged

我在解决一种方法时遇到了一些麻烦,该方法表示一个包含指向托管代码中的short数组的指针的结构。结构看起来像这样:

typedef struct
{
    short size;
    unsigned short** shortValues;
} UnmanagedStruct;

内存为'shortValues'分配在非托管代码中 - 因此,即使该字段只是指向短值数组的指针,也会添加一个额外的间接级别,以便分配的内存被调用者(托管代码)也是。 “size”字段表示数组中的元素数。如何在托管代码中表示这一点?

我以为我只是在IntPtr中传递它,然后在非托管调用返回后我无法弄清楚如何访问这些值。

1 个答案:

答案 0 :(得分:0)

不安全的代码好吗?

public unsafe struct UnmanagedStruct
{
    public short size;
    public ushort** shortValues;
}

[DllImport("example.dll")]
public static extern void GetUnmanagedStruct(out UnmanagedStruct s);

如果你有一个指向ushort s:

数组的指针
public static unsafe void WriteValues()
{
    UnmanagedStruct s;
    GetUnmanagedStruct(out s);
    for (var i = 0; i < s.size; i++)
    {
        ushort x = (*s.shortValues)[i];
        Console.WriteLine(x);
    }
}

如果你有一个由ushort s组成的以null结尾的数组:

public static unsafe void WriteValues()
{
    UnmanagedStruct s;
    GetUnmanagedStruct(out s);
    for (var i = 0; i < s.size; i++)
    {
        for (ushort* p = s.shortValues[i]; p != null; p++)
        {
            ushort x = *p;
            Console.WriteLine(x);
        }
    }
}