Si su C# struct utiliza solo tipos de datos primitivos y tiene exactamente el mismo diseño que su estructura nativa en C++, puede evitar estas restricciones con la memoria manual m gestión y código inseguro. Como beneficio adicional, mejorarás el rendimiento al evitar la clasificación.
asignar la memoria:
IntPtr arr = Marshal.AllocHGlobal (sizeof (MyStruct) * 256);
Esto es básicamente malloc
, por lo que la memoria asignada se encuentra fuera de la conciencia de la GC.
Puede pasar el IntPtr al código nativo como si fuera un MyStruct[256]
y solo el IntPtr se organizará, no la memoria a la que apunta. El código nativo y administrado puede acceder directamente a la misma memoria.
para leer/escribir las estructuras de la matriz con C#, utilizar C# punteros:
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;
}
No se olvide de
Marshal.FreeHGlobal (arr);
cuando haya terminado con la memoria, a free
eso.
¿no hay solución? entonces puedo hacer esto como en C++? – uray
@uray lo único que puedo sugerir es una matriz regular. Si eso no es posible, entonces ... –