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, 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 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.
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 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.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. |
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. Pour obtenir les types correspondants en Visual Basic, C# et C++, consultez Vue d’ensemble de la bibliothèque de classes .NET Framework.