Condividi tramite


Strutture di marshalling in .NET Compact Framework

Aggiornamento: novembre 2007

È possibile incorporare matrici e stringhe in strutture per il marshalling. È necessario utilizzare l'attributo MarshalAsAttribute per specificare come si desidera effettuare il marshalling delle stringhe incorporate, in caso contrario verrà generata un'eccezione.

Quando si effettua il marshalling di una stringa in wchar_t*, è possibile specificare uno dei seguenti attributi per il quale verrà eseguito il marshalling come puntatore a una stringa Unicode:

[MarshalAs(UnmanagedType.LPWStr)]

-oppure-

[MarshalAs(UnmanagedType.LPTStr)]

Nella tabella seguente vengono illustrate le definizioni della struttura per effettuare il marshalling di matrici e stringhe da codice non gestito a codice gestito. In alcuni di questi esempi viene utilizzata la classe MarshalAsAttribute.

Dati per i quali effettuare il marshalling

Struttura non gestita (C++)

Struttura gestita (C#)

Matrice di numeri interi

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

Matrice di caratteri

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

Matrice di caratteri in stringa

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

Puntatore a una stringa

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

Specifica del layout di una struttura

È possibile specificare come disporre le strutture per il gestore di marshalling del richiamo piattaforma con l'attributo StructLayoutAttribute. .NET Compact Framework supporta i tre valori di enumerazione LayoutKind: Auto (predefinito), Sequential e Explicit.

In .NET Compact Framework Auto è equivalente a Sequential.

Quando viene specificato un valore Explicit, è necessario applicare un attributo FieldOffsetAttribute a ogni campo. I valori di byte devono essere compresi entro i limiti del tipo. Ad esempio, i numeri interi a 2 byte devono iniziare su indirizzi pari, i numeri interi a 4 byte su indirizzi divisibili per 4 e così via.

Il campo StructLayoutAttribute.Pack non è supportato.

Vedere anche

Altre risorse

Supporto di marshalling in .NET Compact Framework