我在解决一种方法时遇到了一些麻烦,该方法表示一个包含指向托管代码中的short数组的指针的结构。结构看起来像这样:
typedef struct
{
short size;
unsigned short** shortValues;
} UnmanagedStruct;
内存为'shortValues
'分配在非托管代码中 - 因此,即使该字段只是指向短值数组的指针,也会添加一个额外的间接级别,以便分配的内存被调用者(托管代码)也是。 “size
”字段表示数组中的元素数。如何在托管代码中表示这一点?
我以为我只是在IntPtr
中传递它,然后在非托管调用返回后我无法弄清楚如何访问这些值。
答案 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);
}
}
}