Condividi tramite


Marshalling di diversi tipi di matrici

In questo esempio viene dimostrato come passare i seguenti tipi di matrici:

  • Matrici di interi per valore.

  • Matrici di interi per riferimento, che possono essere ridimensionati.

  • Matrici multidimensionali di integer per valore.

  • Matrici di stringhe per valore.

  • Matrici di strutture con interi.

  • Matrici di strutture con stringhe.

A meno che non si effettui il marshalling esplicito di una matrice per riferimento, il comportamento predefinito prevede il marshalling della matrice come parametro in. È possibile modificare tale comportamento applicando gli attributi InAttribute e OutAttribute in modo esplicito.

Nell'esempio di matrici vengono utilizzate le seguenti funzioni non gestite, illustrate con la dichiarazione di funzione originale:

  • TestArrayOfInts esportata da PinvokeLib.dll.

    int TestArrayOfInts(int* pArray, int pSize);
    
  • TestRefArrayOfInts esportata da PinvokeLib.dll.

    int TestRefArrayOfInts(int** ppArray, int* pSize);
    
  • TestMatrixOfInts esportata da PinvokeLib.dll.

    int TestMatrixOfInts(int pMatrix[][COL_DIM], int row);
    
  • TestArrayOfStrings esportata da PinvokeLib.dll.

    int TestArrayOfStrings(char** ppStrArray, int size);
    
  • TestArrayOfStructs esportata da PinvokeLib.dll.

    int TestArrayOfStructs(MYPOINT* pPointArray, int size);
    
  • TestArrayOfStructs2 esportata da PinvokeLib.dll.

    int TestArrayOfStructs2 (MYPERSON* pPersonArray, int size);
    

PinvokeLib.dll è una libreria non gestita personalizzata contenente implementazioni per le funzioni elencate in precedenza e due variabili di struttura, MYPOINT e MYPERSON. Queste strutture contengono i seguenti elementi:

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

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

In questo esempio le strutture MyPoint e MyPerson contengono tipi incorporati. L'attributo StructLayoutAttribute viene impostato in modo che i membri vengano disposti in sequenza nella memoria, nell'ordine in cui appaiono.

La classe LibWrap contiene un gruppo di metodi chiamati dalla classe App. Per informazioni dettagliate sul passaggio delle matrici, vedere i commenti nell'esempio che segue. Una matrice, che è un tipo di riferimento, viene passata come parametro in per impostazione predefinita. Affinché il chiamante riceva i risultati, è necessario applicare InAttribute e OutAttribute in modo esplicito all'argomento che contiene la matrice.

Vedere anche

Concetti

Marshalling di matrici di tipi

Tipi di dati di platform invoke

Creazione di prototipi nel codice gestito