您必须使用 IntPtr 并将 IntPtr 编组到您想要放入的任何 C# 结构中。在您的情况下,您必须将其编组为 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,否则您将面临泄漏非托管句柄的风险。