C# 当我通过pinvoke获得第一个元素时,如何获取数组中的下一项?

C# 当我通过pinvoke获得第一个元素时,如何获取数组中的下一项?,c#,pinvoke,C#,Pinvoke,我使用的api的方法定义如下: [DllImport("icsneo40.dll")] public static extern Int32 icsneoGetMessages(Int32 hObject, ref icsSpyMessage pMsg, ref Int32 pNumberOfMessages, ref Int32 pNumberOfErrors); 使用icsSpyMessage参数描述为: pMsg[out] 这是数组的第一个元素的地址 icsSpyMes

我使用的api的方法定义如下:

[DllImport("icsneo40.dll")]
public static extern Int32 icsneoGetMessages(Int32 hObject, ref icsSpyMessage pMsg, ref          Int32 pNumberOfMessages, ref Int32 pNumberOfErrors);
使用
icsSpyMessage
参数描述为:

pMsg[out]
这是数组的第一个元素的地址 icsSpyMessage结构。此数组将加载 硬件接收到的消息。此阵列的大小必须适合 20000 icsSpyMessage结构


我的问题是,当我只有第一个元素时,如何访问数组中的其他元素?

既然要传递数组,那么应该将
icsSpyMessage
声明为数组:

[DllImport("icsneo40.dll")]
public static extern Int32 icsneoGetMessages(
    Int32 hObject, 
    [Out] icsSpyMessage[] pMsg,
    ref Int32 pNumberOfMessages, 
    ref Int32 pNumberOfErrors
);
[out]属性指示p/invoke封送器将本机内存封送回托管结构数组。封送器将根据托管数组的长度封送元素

因此,您需要在调用函数之前分配此数组。您正在调用的API要求您提供至少20000个元素的数组

icsSpyMessage[] pMsg = new icsSpyMessage[20000];
Int32 result = icsneoGetMessages(hObject, pMsg, 
    ref pNumberOfMessages, ref pNumberOfErrors);
像这样:

[DllImport("icsneo40.dll")]

public static extern Int32 icsneoGetMessages(
    Int32 hObject, 
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)]
    out icsSpyMessage[] pMsg, 
    ref Int32 pNumberOfMessages, 
    ref Int32 pNumberOfErrors
);

为什么要把事情复杂化?所有这些都是指向某种结构或结构数组的指针。因此,请声明大小为20k的数组

icsSpyMessage myMessages[20000]

按如下方式将其传递给此方法:

[DllImport("icsneo40.dll")]
public static extern Int32 icsneoGetMessages(Int32 hObject, ref icsSpyMessage pMsg, ref          Int32 pNumberOfMessages, ref Int32 pNumberOfErrors);
int result=icsnoGetMessages( 等等,
myMessages[0],//这是不正确的。它不应该使用
out
参数。应该删除该参数。相反,您需要
[out]
属性。请参阅我的答案。由于默认行为是封送整个数组,因此不需要使用
MarshalAs
。我想SizeParamIndex可能对性能有价值。