int配列から IntPtrに変換する - C#
intの配列(int以外の配列も含む)から、配列を示すIntPtrへ変換する方法を紹介します。
概要
配列を指すIntPtrを用意することはできないため、Marshalを使いメモリを新たに確保し、その領域に配列のデータをコピーする方法を使います。
コード例
int[] tabarray = new int[] { 3, 9, 10, 20, 4, 5};
IntPtr parray = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(int)) * tabarray.Length);
Marshal.Copy(tabarray, 0, parray, tabarray.Length);
解説
int[] tabarray = new int[] { 3, 9, 10, 20, 4, 5};
にて、配列を作成します。
IntPtr parray = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(int)) * tabarray.Length);
AllocCoTaskMemメソッドを呼び出し、ポインタ(IntPtr)のメモリを確保します。サイズはMarshal.SizeOfメソッドで計算します。Marshal.SizeOfメソッドの引数にはSystem.Typeの型オブジェクトを与えます。型はtypeofキーワードで取得できます。詳しくは
こちらの記事を参照してください。
Marshal.Copy(tabarray, 0, parray, tabarray.Length);
Maarshal.Copyメソッドを呼び出し、配列のデータをポインタ(IntPtr)の示すメモリにコピーします。
補足
この処理を用いるケースの多くはWindows APIの型がIntPtrの引数に配列の値を与える場合です。DllImport側のIntPtrをint[]型に変更すると上記のMarshalによるメモリ確保をせずに直接int配列をインポートした関数に与えることができます。DllImport側の変更で対応できないか検討してみると良いかもしれません。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用