簡単に言えば、これは直接行うことはできません。その理由は、変換関数を渡すと、インデックス操作を実行する従来のインデックス対応コンテナー ( System.Array
、Collections.IList
、ArrayList
など) が結果を にキャストしようとするためSystem.Object
です。C# のポインターは から派生しないためObject
、SystemNotSupported
または同様の例外が発生します。
2 つの合理的な回避策があります。
- メソッドを呼び出す前に、ポインター配列を void ポインター配列に変換します。
- メソッドを呼び出す前に、ポインター配列を void ポインター ポインターに変換します。
最初のものは、配列の内容全体を for ループで複製する必要があるため、かなり面倒です。System.Array
2 番目のオプションでは、管理オブジェクトでラップされなくなったため、配列の長さを渡す必要があります。
サンプルコード
方法:
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 ポインター ポインター配列):
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);
}
TotalSize
とは、多次元ReshapeArray
配列を処理するために作成されたヘルパー関数です。これを達成する方法のヒントについては、次を参照してください: Programatically Declare Array of Arbitrary Rank .