Types blittables et non blittables

La plupart des types de données ont une représentation commune en mémoire managée et non managée et ne nécessitent pas de traitement particulier par le marshaleur d’interopérabilité. Ces types sont appelés types blittables, parce qu'ils ne nécessitent aucune conversion lorsqu'ils sont transmis entre du code managé et du code non managé.

Les structures qui sont retournées par les appels de code non managé doivent être des types blittables. Platform Invoke ne prend pas en charge les structures non blittables comme types de retour.

Les types suivants issus de l’espace de noms System sont des types blittables :

Les types complexes suivants sont également des types blittables :

  • Tableaux unidimensionnels de types primitifs blittables, comme un tableau d’entiers. Toutefois, un type qui contient un tableau de variables de types blittables n’est pas lui-même blittable.
  • Types valeur formatés qui contiennent uniquement des types blittables (et des classes lorsqu’elles sont marshalisées en tant que types formatés). Pour plus d’informations sur les types de valeur formatés, consultez Marshalling par défaut pour les types de valeur.

Les références d’objet ne sont pas blittables. En outre, un tableau de références aux objets qui sont blittables par eux-mêmes n’est pas blittable. Par exemple, vous pouvez définir une structure qui est blittable, mais vous ne pouvez pas définir un type blittable qui contient un tableau de références à ces structures.

Par souci d’optimisation, les tableaux de classes et de types primitifs blittables qui ne contiennent que des membres blittables sont épinglés au lieu d’être copiés lors du marshaling. Ces types semblent être marshalés en tant que paramètres en entrée/sortie quand l’appelant et l’appelé résident dans le même cloisonnement. Cependant, ces types sont en fait marshalés en tant que paramètres en entrée et vous devez appliquer les attributs InAttribute et OutAttribute si vous voulez marshaler l’argument en tant que paramètre en entrée/sortie.

Certains types de données managés requièrent une représentation différente dans un environnement non managé. Ces types de données non blittables doivent être convertis dans un format pouvant être marshalisé. Par exemple, les chaînes de caractères managées sont des types non blittables, car elles doivent être converties en objets chaîne avant de pouvoir être marshalisées.

Le tableau suivant répertorie les types non-blittables de l’espace de noms System. Les délégués, qui sont des structures de données qui réfèrent à une méthode statique ou à une instance de classe, sont également non blittables.

Type nonblittable Description
System.Array Convertit en tableau de style C ou en SAFEARRAY.
System.Boolean Convertit en valeur de 1, 2 ou 4 octets, la valeur true ayant pour valeur 1 ou -1.
System.Char Convertit en caractère ANSI ou Unicode.
System.Class Convertit en interface de classe.
System.Object Convertit en interface ou en variant.
System.String Convertit en chaîne terminée par une référence nulle ou en BSTR.
System.ValueType Convertit en une structure avec une disposition de mémoire fixe.
T[] Convertit en tableau de style C ou en SAFEARRAY.

Les types d’objets et de classes sont pris en charge uniquement par COM Interop.

Voir aussi