如何在C#中声明结构类型的固定大小数组:
[StructLayout(LayoutKind.Sequential,Pack=1), Serializable]
public unsafe struct MyStruct{
...
}
public class MyClass {
...
public fixed MyStruct myStruct[256];
}
这将导致CS1663:不允许使用结构类型的固定大小缓冲区,我该如何解决这个问题?我不想使用C#或“托管集合数据结构”类型,因为我需要经常将其编组为本机C ++
答案 0 :(得分:9)
如果您的C#struct仅使用原始数据类型并且与C ++中的本机结构具有完全相同的布局,则可以通过手动内存管理和不安全的代码来解决这些限制。作为奖励,您将通过避免编组来提高性能。
分配内存:
IntPtr arr = Marshal.AllocHGlobal (sizeof (MyStruct) * 256);
这基本上是malloc
,因此分配的内存超出了GC的意识。
您可以将IntPtr传递给本机代码,就像它是MyStruct[256]
一样,只有IntPtr会被编组,而不是它指向的内存。本机代码和托管代码可以直接访问相同的内存。
要使用C#读取/写入数组中的结构,请使用C#指针:
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;
}
别忘了
Marshal.FreeHGlobal (arr);
当你完成记忆后,到free
它。
答案 1 :(得分:3)
你不能; per the definition
唯一的限制是数组类型必须是
bool
,byte
,char
,short
,int
,long
,{ {1}},sbyte
,ushort
,uint
,ulong
或float