2011-11-01 15 views
8

¿cómo Declaro matriz de tamaño fijo de un tipo de estructura en C#:tamaño fijo matriz de tipo Estructura

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

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

esto dará lugar a CS1663: fijo tampones de tamaño de tipo de estructura no está permitido, ¿cómo ¿esta solución?, prefiero no utilizar el tipo C# o "Estructura de datos de la Colección Gestionada", ya que necesito ubicarlo frecuentemente en C++ nativo

Respuesta

9

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.

3

No se puede; per the definition

La única restricción es que el tipo de matriz debe ser bool, byte, char, short, int, long, sbyte, ushort, uint, ulong, float, o double.

+0

¿no hay solución? entonces puedo hacer esto como en C++? – uray

+0

@uray lo único que puedo sugerir es una matriz regular. Si eso no es posible, entonces ... –

Cuestiones relacionadas