유형 배열에 대한 포인터 마샬링 (관리 된 C# -> 관리되지 않은 C ++)
문제
나는 관리 된 코드의 반바지 배열에 대한 포인터가 포함 된 구조를 나타내는 방법에 약간의 문제가 있습니다. 구조물은 다음과 같습니다.
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
에스:
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
에스:
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);
}
}
}
제휴하지 않습니다 StackOverflow