简短的回答是,这不能直接完成。原因是,如果您传递您的转换函数,任何执行索引操作的常规索引容器(System.Array
、、、Collections.IList
等ArrayList
)都将尝试将结果转换为System.Object
. C# 中的指针不是从 派生的Object
,因此这将导致一个SystemNotSupported
或类似的异常。
有两种合理的解决方法:
- 在调用方法之前将指针数组转换为 void 指针数组。
- 在调用方法之前将指针数组转换为 void 指针指针。
第一个相当麻烦,因为它需要使用 for 循环复制数组的全部内容。第二个选项需要传入数组的长度,因为它不再用托管System.Array
对象包装。
示例代码
方法:
unsafe Array ToIntPtrArray(void** a, int count)
{
IntPtr[] intPtrArray = new IntPtr[count];
for (int n = 0; n < count; n++)
intPtrArray[n] = new IntPtr(a[n]);
return intPtrArray;
}
示例用法(整数指针数组):
int*[] intPtrArray;
// Code that initializes the values of intPtrArray
fixed(int** ptr = &intPtrArray[0])
{
Array result = ToIntPtrArray((void**)ptr, intPtrArray.Length);
}
示例用法(空指针指针数组):
void**[] voidPtrPtrArray;
// Code that initializes the values of voidPtrPtrArray
fixed(void*** ptr = &voidPtrPtrArray[0])
{
Array result = ToIntPtrArray((void**)ptr, voidPtrPtrArray.Length);
}
示例用法(多维 int 指针数组):
int*[,] int2dArray;
// Code that initializes the values of int2dArray
fixed(int** ptr = &int2dArray[0,0])
{
Array result = ToIntPtrArray((void**)ptr, TotalSize(int2dArray));
Array reshaped = ReshapeArray(result,int2dArray);
}
whereTotalSize
和ReshapeArray
是为处理多维数组而编写的辅助函数。有关如何完成此操作的提示,请参阅:Programatically Declare Array of Arbitrary Rank。