문제

나는 관리 된 코드의 반바지 배열에 대한 포인터가 포함 된 구조를 나타내는 방법에 약간의 문제가 있습니다. 구조물은 다음과 같습니다.

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);
        }
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top