Поделиться через


Маршалинг различных типов массивов

В этом примере показан способ передачи массивов следующих типов.

  • Массив целочисленных значений по значению.

  • Массив целочисленных значений по ссылке. Размер массива можно изменять.

  • Многомерный массив (матрица) целочисленных значений по значению.

  • Массив строк по значению.

  • Массив структур с целочисленными значениями.

  • Массив структур со строками.

Если маршалинг по ссылке не выполняется для массива явным образом, по умолчанию выполняется маршалинг массива в виде параметра In. Это поведение можно изменить, явным образом применяя атрибуты InAttribute и OutAttribute.

В этом примере используются следующие неуправляемые функции, показанные со своим исходным объявлением.

  • Функция TestArrayOfInts, экспортированная из PinvokeLib.dll.

    int TestArrayOfInts(int* pArray, int pSize);
    
  • Функция TestRefArrayOfInts, экспортированная из PinvokeLib.dll.

    int TestRefArrayOfInts(int** ppArray, int* pSize);
    
  • Функция TestMatrixOfInts, экспортированная из PinvokeLib.dll.

    int TestMatrixOfInts(int pMatrix[][COL_DIM], int row);
    
  • Функция TestArrayOfStrings, экспортированная из PinvokeLib.dll.

    int TestArrayOfStrings(char** ppStrArray, int size);
    
  • Функция TestArrayOfStructs, экспортированная из PinvokeLib.dll.

    int TestArrayOfStructs(MYPOINT* pPointArray, int size);
    
  • Функция TestArrayOfStructs2, экспортированная из PinvokeLib.dll.

    int TestArrayOfStructs2 (MYPERSON* pPersonArray, int size);
    

PinvokeLib.dll — это пользовательская неуправляемая библиотека, содержащая реализации ранее описанных функций и две переменные структуры, MYPOINT и MYPERSON. Эти структуры содержат следующие элементы:

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

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

В этом примере структуры MyPoint и MyPerson содержат вложенные типы. Атрибут StructLayoutAttribute задается, чтобы гарантировать последовательный порядок членов в памяти, соответствующий порядку их появления.

Класс LibWrap содержит набор методов, вызываемых классом App. Конкретные сведения о передаче массивов см. в комментариях к следующему примеру. Массив, который является ссылочным типом, по умолчанию передается в виде параметра In. Чтобы вызывающий объект мог получать результаты, необходимо явным образом применить атрибуты InAttribute и OutAttributeк аргументу, содержащему массив.

См. также

Основные понятия

Маршалинг массивов типов

Типы данных вызовов неуправляемого кода

Создание прототипов в управляемом коде