封送處理不同型別的陣列
這個範例示範如何傳遞下列陣列型別:
以傳值方式的整數陣列
以傳址方式的整數陣列,其大小可以調整
以傳值方式之整數的多維陣列 (矩陣)
以傳值方式的字串陣列
具有整數的結構陣列
具有字串的結構陣列
除非陣列是以傳址方式明確地封送處理,否則預設行為會將陣列當成 In 參數封送處理。 您可以明確套用 InAttribute 和 OutAttribute 屬性,來改變此行為。
陣列範例使用下列 Unmanaged 函式,顯示其原始函式宣告:
從 PinvokeLib.dll 匯出 TestArrayOfInts。
int TestArrayOfInts(int* pArray, int pSize);
從 PinvokeLib.dll 匯出 TestRefArrayOfInts。
int TestRefArrayOfInts(int** ppArray, int* pSize);
從 PinvokeLib.dll 匯出 TestMatrixOfInts。
int TestMatrixOfInts(int pMatrix[][COL_DIM], int row);
從 PinvokeLib.dll 匯出 TestArrayOfStrings。
int TestArrayOfStrings(char** ppStrArray, int size);
從 PinvokeLib.dll 匯出 TestArrayOfStructs。
int TestArrayOfStructs(MYPOINT* pPointArray, int size);
從 PinvokeLib.dll 匯出 TestArrayOfStructs2。
int TestArrayOfStructs2 (MYPERSON* pPersonArray, int size);
PinvokeLib.dll 是自訂的 Unmanaged 程式庫,包含先前列示的函式和兩個結構變數 (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 套用至含有陣列的引數。