从IntPtr获取struct数组

Mor*_*roz 11 c# arrays marshalling intptr

我有一些像这样的结构

struct MyStruct
{
    public int field1;
    public int field2;
    public int field3;
}
Run Code Online (Sandbox Code Playgroud)

我有指向此结构数组的指针.所以,我需要从这个指针获取数组.我试图使用Marshal.PtrToStructure,但我有内存读取错误.这是我的方法:

public MyStruct[] GetArrayOfStruct(IntPtr pointerToStruct, int length)
{
    var sizeInBytes = Marshal.SizeOf(typeof(TCnt));
    MyStruct[] output = new MyStruct[length];

    for (int i = 0; i < length; i++)
    {
        IntPtr p = new IntPtr((pointerToStruct.ToInt32() + i * sizeInBytes));

        output[i] = (MyStruct)System.Runtime.InteropServices.Marshal.PtrToStructure(p, typeof(MyStruct));
    }

    return output;
}
Run Code Online (Sandbox Code Playgroud)

那么,我做错了什么?

Mat*_*ert 9

这个函数对我有用,假设结构大小是固定的

public static void MarshalUnmananagedArray2Struct<T>(IntPtr unmanagedArray, int length, out T[] mangagedArray)
{
    var size = Marshal.SizeOf(typeof(T));
    mangagedArray = new T[length];

    for (int i = 0; i < length; i++)
    {
        IntPtr ins = new IntPtr(unmanagedArray.ToInt64() + i * size);
        mangagedArray[i] = Marshal.PtrToStructure<T>(ins);
    }
 }
Run Code Online (Sandbox Code Playgroud)


Han*_*ant 5

两个问题。您在 Marshal.SizeOf() 调用中使用 TCnt 而不是 MyStruct。您的 IntPtr 算术无法在 64 位计算机上运行,​​您必须使用 IntPtr.ToInt64() 或强制转换为 (long)。

当然,得到错误的 IntPtr 或长度也是有可能的。使用 Debug + Windows + Memory + Memory 1 并将“pointerToStruct”放入地址框中进行基本验证。