types blittable et non blittable

La plupart des types de données ont une représentation commune à la fois dans la 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, car ils ne nécessitent pas de conversion quand ils transitent entre le code managé et le code non managé.

Les structures qui sont retournées par les appels de code non managé doivent être des types blittables. L’appel de code non managé ne prend en charge aucune structure non blittable comme type 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, tels qu’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 mis en forme qui ne contiennent que des types blittables (et des classes s’ils sont marshalés comme types mis en forme). Pour plus d’informations sur les types valeur mis en forme, consultez Marshaling par défaut pour les types valeur.

Les références d’objets ne sont pas blittables. Cela inclut un tableau de références aux objets qui sont blittables en eux-mêmes. Par exemple, vous pouvez définir une structure blittable, mais vous ne pouvez pas définir un type blittable contenant un tableau de références à ces structures.

En guise d’optimisation, les tableaux de types primitifs blittables et les classes qui contiennent uniquement des membres blittables sont épinglés au lieu d’être copiés pendant le 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 sous une forme qui peut être marshalée. Par exemple, les chaînes managées sont des types non blittables parce qu’elles doivent être converties en objets String avant de pouvoir être marshalées.

Le tableau suivant répertorie des types non blittables issus 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 non blittable 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.Mdarray Convertit en tableau de style C ou en SAFEARRAY.
System.String Convertit en chaîne se terminant par une référence null ou en BSTR.
System.Valuetype Convertit en structure avec une disposition de mémoire fixe.
System.Szarray Convertit en tableau de style C ou en SAFEARRAY.

Les types d’objets et de classes sont pris en charge uniquement par COM Interop. Pour obtenir les types correspondants en Visual Basic, C# et C++, consultez Vue d’ensemble de la bibliothèque de classes .NET Framework.

Voir aussi