tipi copiabili e non copiabili

La maggior parte dei tipi di dati ha una rappresentazione comune sia nella memoria gestita sia in quella non gestita e non richiede quindi una gestione particolare tramite il gestore di marshalling di interoperabilità. Questi tipi sono definiti copiabili da BLT, poiché non richiedono la conversione quando vengono passati tra codice gestito e codice non gestito.

Le strutture restituite dalle chiamate platform invoke devono essere tipi copiabili da BLT. Platform invoke non supporta strutture non copiabili da BLT come tipi restituiti.

I tipi dello spazio dei nomi System elencati di seguito sono copiabili da BLT:

Sono copiabili da BLT anche i tipi complessi seguenti:

  • Matrici unidimensionali di tipi primitivi copiabili da BLT, come una matrice di integer. Non è tuttavia copiabile da BLT un tipo contenente una matrice variabile di tipi copiabili da BLT.

  • Tipi valore formattati contenenti solo tipi copiabili da BLT (e classi, se sottoposti a marshalling come tipi formattati). Per altre informazioni sui tipi valore formattati, vedere Marshalling predefinito per i tipi valore.

Non sono copiabili da BLT i riferimenti a oggetti, incluse le matrici di riferimenti a oggetti che invece sono copiabili da BLT. È possibile, ad esempio, definire una struttura copiabile da BLT, ma non un tipo copiabile da BLT contenente una matrice di riferimenti alla struttura.

Per motivi di ottimizzazione, le matrici di tipi e classi copiabili da BLT contenenti solo membri copiabili da BLT vengono bloccate e non copiate durante il marshalling. Quando il chiamante e il chiamato si trovano nello stesso apartment, può sembrare che il marshalling di questi tipi venga eseguito come parametri in/out. Il marshalling di questi tipi, in realtà, viene eseguito come parametri in ed è necessario applicare gli attributi InAttribute e OutAttribute se si vuole eseguire il marshalling dell'argomento come parametro in/out.

Alcuni tipi di dati gestiti richiedono una rappresentazione diversa in un ambiente non gestito. Questi tipi di dati non copiabili da BLT devono essere convertiti in un formato di cui è possibile eseguire il marshalling. Le stringhe gestite, ad esempio, sono tipi non copiabili da BLT perché devono essere convertite in oggetti stringa prima di poter eseguire il marshalling.

Nella tabella seguente sono elencati i tipi non copiabili da BLT dello spazio dei nomi System. Anche i delegati, ossia le strutture di dati che fanno riferimento a un metodo statico o a un'istanza di classe, non sono copiabili da BLT.

Tipi non copiabili da BLT Descrizione
System.Array Viene convertito in una matrice di tipo C o in SAFEARRAY.
System.Boolean Viene convertito in un valore a 1, 2 o 4 byte con true pari a 1 o -1.
System.Char Viene convertito in un carattere Unicode o ANSI.
System.Class Viene convertito in un'interfaccia di classe.
System.Object Viene convertito in una variante o in un'interfaccia.
System.Mdarray Viene convertito in una matrice di tipo C o in SAFEARRAY.
System.String Viene convertito in una stringa che termina con un riferimento Null o un BSTR.
System.Valuetype Viene convertito in una struttura con un layout a memoria fissa.
System.Szarray Viene convertito in una matrice di tipo C o in SAFEARRAY.

I tipi di classe e oggetto sono supportati solo dall'interoperabilità COM. Per i tipi corrispondenti in Visual Basic, C#, e C++, vedere Panoramica della libreria di classi.

Vedi anche