Маршалинг различных типов массивов
В этом примере показан способ передачи массивов следующих типов.
Массив целочисленных значений по значению.
Массив целочисленных значений по ссылке. Размер массива можно изменять.
Многомерный массив (матрица) целочисленных значений по значению.
Массив строк по значению.
Массив структур с целочисленными значениями.
Массив структур со строками.
Если маршалинг по ссылке не выполняется для массива явным образом, по умолчанию выполняется маршалинг массива в виде параметра 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к аргументу, содержащему массив.