Share via


Calcular referencias de estructuras en .NET Compact Framework

Actualización: noviembre 2007

Puede incrustar matrices y cadenas en estructuras para calcular referencias. Debe utilizar el atributo MarshalAsAttribute para especificar cómo desea calcular las referencias de las cadenas incrustadas; en caso contrario, se produce una excepción.

Al calcular la referencia de una cadena a un wchar_t*, puede especificar alguno de los siguientes atributos, que calculará la referencia como puntero a una cadena Unicode:

[MarshalAs(UnmanagedType.LPWStr)]

O bien

[MarshalAs(UnmanagedType.LPTStr)]

La tabla siguiente muestra las definiciones de estructura para calcular referencias a las matrices y cadenas desde código administrado a no administrado. Observe que algunos de estos ejemplos utilizan MarshalAsAttribute.

Datos para los que se van a calcular referencias

Estructura no administrada (C++)

Estructura administrada (C#)

Matriz de enteros

typedef struct _MyStruct
{
  int intArray[10]; 
} MyStruct;
struct MyStruct
{
  [MarshalAs(
    UnmanagedType.ByValArray, 
    SizeConst = 10)]
  int[] intArray;
}

Matriz de caracteres

typedef struct _MyStruct
{
  char charArray[10]; 
} MyStruct;
struct MyStruct
{
  [MarshalAs(
    UnmanagedType.ByValArray, 
    SizeConst = 10)]
  char[] charArray;
}

Matriz de caracteres a cadena

typedef struct _MyStruct
{
  char charArray[10]; 
} MyStruct;
struct MyStruct
{
  [MarshalAs(
    UnmanagedType.ByValTStr, 
    SizeConst = 10)]
  String str;
}

Puntero a cadena

typedef struct _MyStruct
{
  wchar_t *pStr; 
} MyStruct;
struct MyStruct
{
  [MarshalAs(
    UnmanagedType.LPWStr)]
  String str;
}

Especificar un diseño de estructura

Puede especificar cómo diseñar estructuras para el contador de referencias de invocación de plataforma con el atributo StructLayoutAttribute. .NET Compact Framework admite los tres valores de la enumeración LayoutKind: Auto (valor predeterminado), Sequential y Explicit.

En .NET Compact Framework, Auto es equivalente a Sequential.

Cuando se especifica un valor de Explicit, se debe aplicar un atributo FieldOffsetAttribute a todos los campos. Los valores de byte deben encontrarse entre los límites del tipo. Por ejemplo, los enteros de 2 bytes se deben iniciar en direcciones exactas, los enteros de 4 bytes se deben iniciar en direcciones divisibles por 4, etc.

Observe que no se admite el campo StructLayoutAttribute.Pack.

Vea también

Otros recursos

Compatibilidad con el cálculo de referencias en .NET Compact Framework