Fixed Size Array of Structure type

2019-04-21 20:56发布

how do I declare fixed-size array of a structure type in C# :

[StructLayout(LayoutKind.Sequential,Pack=1), Serializable]
public unsafe struct MyStruct{
    ...
}

public class MyClass {
    ...
    public fixed MyStruct myStruct[256];
}

this will result to CS1663 : fixed size buffers of struct type is not allowed, how do I workaround this ?, I prefer not to use C# or "Managed Collection data structure" type, as I need to frequently marshall this to native C++

2条回答
聊天终结者
2楼-- · 2019-04-21 21:43

If your C# struct uses only primitive data types and has exactly the same layout as your native struct in C++, you can get around these restrictions with manual memory management and unsafe code. As a bonus, you will improve performance by avoiding marshalling.

Allocate the memory:

IntPtr arr = Marshal.AllocHGlobal (sizeof (MyStruct) * 256);

This is basically malloc, so the allocated memory is outside the awareness of the GC.

You can pass the IntPtr to native code as if it were a MyStruct[256] and only the IntPtr will be marshalled, not the memory it points to. Native and managed code can access the same memory directly.

To read/write the structs in the array with C#, use C# pointers:

static unsafe MyStruct GetMyStructAtIndex (IntPtr arr, int index)
{
    MyStruct *ptr = ((MyStruct *)arr) + index;
    return *ptr;
}

static unsafe void SetMyStructAtIndex (IntPtr arr, int index, MyStruct value)
{
    MyStruct *ptr = ((MyStruct *)arr) + index;
    *ptr = value;
}

Don't forget to

Marshal.FreeHGlobal (arr);

when you're done with the memory, to free it.

查看更多
兄弟一词,经得起流年.
3楼-- · 2019-04-21 21:44

You can't; per the definition

The only restriction is that the array type must be bool, byte, char, short, int, long, sbyte, ushort, uint, ulong, float, or double.

查看更多
登录 后发表回答