Partager via


Marshaling de différents types de tableaux

Cet exemple montre comment passer les types suivants de tableaux :

  • Tableau d'entiers par valeur.

  • Tableau d'entiers par référence qui peut être redimensionné.

  • Tableau multidimensionnel (matrice) d'entiers par valeur.

  • Tableau de chaînes par valeur.

  • Tableau de structures avec entiers.

  • Tableau de structures avec chaînes.

À moins qu'un tableau soit explicitement marshalé par référence, le comportement par défaut marshale le tableau en tant que paramètre en entrée. Vous pouvez changer ce comportement en appliquant explicitement les attributs InAttribute et OutAttribute.

L'exemple Arrays utilise les fonctions non managées suivantes, illustrées avec leur déclaration de fonction d'origine :

  • TestArrayOfInts exportée à partir de PinvokeLib.dll.

    int TestArrayOfInts(int* pArray, int pSize);
    
  • TestRefArrayOfInts exportée à partir de PinvokeLib.dll.

    int TestRefArrayOfInts(int** ppArray, int* pSize);
    
  • TestMatrixOfInts exportée à partir de PinvokeLib.dll.

    int TestMatrixOfInts(int pMatrix[][COL_DIM], int row);
    
  • TestArrayOfStrings exportée à partir de PinvokeLib.dll.

    int TestArrayOfStrings(char** ppStrArray, int size);
    
  • TestArrayOfStructs exportée à partir de PinvokeLib.dll.

    int TestArrayOfStructs(MYPOINT* pPointArray, int size);
    
  • TestArrayOfStructs2 exportée à partir de PinvokeLib.dll.

    int TestArrayOfStructs2 (MYPERSON* pPersonArray, int size);
    

PinvokeLib.dll est une bibliothèque non managée personnalisée qui contient des implémentations pour les fonctions précédemment répertoriées et les deux variables de structure MYPOINT et MYPERSON. Ces structures contiennent les éléments suivants :

typedef struct _MYPOINT
{
   int x; 
   int y; 
} MYPOINT;

typedef struct _MYPERSON
{
   char* first; 
   char* last; 
} MYPERSON;

Dans cet exemple, les structures MyPoint et MyPerson contiennent des types incorporés. L'attribut StructLayoutAttribute est défini afin de garantir que les membres sont disposés en mémoire de manière séquentielle, dans l'ordre de leur apparition.

La classe LibWrap contient un ensemble de méthodes appelées par la classe App. Pour des informations spécifiques relatives au passage de tableaux, consultez les commentaires dans l'exemple suivant. Un tableau, qui est un type référence, est passé comme paramètre en entrée par défaut. Pour que l'appelant reçoive les résultats, InAttribute et OutAttribute doivent être appliqués explicitement à l'argument contenant le tableau.

Voir aussi

Concepts

Marshaling des tableaux de types

Types de données d'appel de code non managé

Création de prototypes dans du code managé