封送处理不同类型的数组
该示例说明如何传递以下类型的数组:
通过值传递的整数数组。
通过引用传递的整数数组,它可以调整大小。
通过值传递的多维整数数组(矩阵)。
通过值传递的字符串数组。
包含整数的结构数组。
包含字符串的结构数组。
除非数组是通过引用显式封送的,否则默认行为将该数组作为 In 参数进行封送处理。 可以通过显式应用 InAttribute 和 OutAttribute 特性来更改此行为。
Arrays 示例使用以下非托管函数(这里同时显示其原始函数声明):
从 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 是一个自定义非托管库,它包含前面列出的函数的实现和以下两个结构变量: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 显式应用于包含该数组的参数。