我有一些麻烦沉降上的方式来表示包含一个指向短裤在我的托管代码的阵列的结构。该结构是这样的:

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

关于“shortValues”内存被分配非托管代码内 - 因此,即使该字段是一个简单的指针短值的数组中,加入额外的间接水平,使得分配的内存被呼叫方(管理代码看出)了。在“size”字段表示数组中元素的数目。如何代表这在托管代码?

我想我会通过它只是一个IntPtr,那么我无法弄清楚如何访问一次非托管调用返回的值。

有帮助吗?

解决方案

时不安全代码好吗?

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

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

如果你有一个指针ushorts的数组:

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);
    }
}

如果你有ushorts的空终止数组的数组:

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);
        }
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top