C# 封送指向类型数组的指针(托管C&>;非托管C&&x2B;&)

C# 封送指向类型数组的指针(托管C&>;非托管C&&x2B;&),c#,pointers,double,unmanaged,C#,Pointers,Double,Unmanaged,我很难确定如何表示一个结构,该结构包含一个指向托管代码中一个短数组的指针。结构如下所示: typedef struct { short size; unsigned short** shortValues; } UnmanagedStruct; “shortValues”的内存是在非托管代码中分配的——因此,即使该字段只是指向短值数组的指针,也添加了一个额外的间接级别,以便调用者(托管代码)也能看到分配的内存。“size”字段表示数组中的元素数。我如何在托管代码中表示这一点 我

我很难确定如何表示一个结构,该结构包含一个指向托管代码中一个短数组的指针。结构如下所示:

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);
如果您有一个指向
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);
    }
}
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);
        }
    }
}

我觉得那代码完全正确。谢谢dtb!当我引起你的注意时,我能问另外一个问题吗?我已经在另一个帖子中发布了它:顺便说一句:更新你的问题比用新的细节发布你的问题的答案要好。另外,如果一个答案解决了你的问题,别忘了接受它!:)