IntPtr を使用し、その IntPtr を配置したい C# 構造にマーシャリングする必要があります。この場合、int[] にマーシャリングする必要があります。
これは、いくつかの手順で行われます。
- アンマネージ ハンドルを割り当てる
- 管理されていない配列で関数を呼び出す
- 配列をマネージド バイト配列に変換する
- バイト配列を int 配列に変換する
- アンマネージ ハンドルの解放
そのコードはあなたにアイデアを与えるはずです:
// The import declaration
[DllImport("Library.dll")]
public static extern int primary_read_serial(int, ref int, IntPtr, int) ;
// Allocate unmanaged buffer
IntPtr serial_ptr = Marshal.AllocHGlobal(length * sizeof(int));
try
{
// Call unmanaged function
int return_code;
int result = primary_read_serial(handle, ref return_code, serial_ptr, length);
// Safely marshal unmanaged buffer to byte[]
byte[] bytes = new byte[length * sizeof(int)];
Marshal.Copy(serial_ptr, bytes, 0, length);
// Converter to int[]
int[] ints = new int[length];
for (int i = 0; i < length; i++)
{
ints[i] = BitConverter.ToInt32(bytes, i * sizeof(int));
}
}
finally
{
Marshal.FreeHGlobal(serial_ptr);
}
try-finally を忘れないでください。そうしないと、アンマネージ ハンドルがリークする危険があります。