目次

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を愛用
掲載日: 2012-07-12
iPentec all rights reserverd.