Marshallen verschiedener Typen von Arrays
In diesem Beispiel wird die Übergabe der folgenden Arraytypen demonstriert:
Array von Ganzzahlen durch einen Wert.
Array von Ganzzahlen durch einen Wert, dessen Größe geändert werden kann.
Mehrdimensionales Array (Matrix) von Ganzzahlen durch einen Wert.
Array von Zeichenfolgen durch einen Wert.
Array von Strukturen mit Ganzzahlen.
Array von Strukturen mit Zeichenfolgen.
Sofern es nicht explizit durch einen Verweis gemarshallt wird, wird ein Array standardmäßig als In-Parameter gemarshallt. Sie können dieses Verhalten ändern, indem Sie das InAttribute-Attribut und das OutAttribute-Attribut anwenden.
Das Arrays-Beispiel verwendet die folgenden nicht verwalteten Funktionen, die jeweils zusammen mit ihrer ursprünglichen Funktionsdeklaration aufgeführt werden:
TestArrayOfInts aus PinvokeLib.dll exportiert.
int TestArrayOfInts(int* pArray, int pSize);
TestRefArrayOfInts aus PinvokeLib.dll exportiert.
int TestRefArrayOfInts(int** ppArray, int* pSize);
TestMatrixOfInts aus PinvokeLib.dll exportiert.
int TestMatrixOfInts(int pMatrix[][COL_DIM], int row);
TestArrayOfStrings aus PinvokeLib.dll exportiert.
int TestArrayOfStrings(char** ppStrArray, int size);
TestArrayInStruct aus PinvokeLib.dll exportiert.
int TestArrayOfStructs(MYPOINT* pPointArray, int size);
TestArrayOfStructs2 aus PinvokeLib.dll exportiert.
int TestArrayOfStructs2 (MYPERSON* pPersonArray, int size);
PinvokeLib.dll ist eine benutzerdefinierte, nicht verwaltete Bibliothek, die Implementierungen für die zuvor aufgelisteten Funktionen und zwei Strukturen (MYPOINT und MYPERSON) enthält. Die Strukturen enthalten die folgenden Elemente:
typedef struct _MYPOINT
{
int x;
int y;
} MYPOINT;
typedef struct _MYPERSON
{
char* first;
char* last;
} MYPERSON;
In diesem Beispiel enthalten die Strukturen MyPoint und MyPerson eingebettete Typen. Das StructLayoutAttribute-Attribut ist so eingerichtet, dass sichergestellt wird, dass die Member im Speicher sequenziell in der Reihenfolge ihres Erscheinens angeordnet sind.
Die LibWrap-Klasse enthält eine durch die App-Klasse aufgerufene Gruppe von Methoden. Ausführliche Informationen zur Übergabe von Arrays finden Sie in den Kommentaren im folgenden Beispiel. Ein Array, bei dem es sich um einen Referenztyp handelt, wird standardmäßig als In-Parameter übergeben. Damit der Aufrufer die Ergebnisse erhält, müssen InAttribute und OutAttribute explizit auf das Argument angewendet werden, welches das Array enthält.