Поскольку вы передаете массив, вы должны объявить icsSpyMessage
как массив:
[DllImport("icsneo40.dll")]
public static extern Int32 icsneoGetMessages(
Int32 hObject,
[Out] icsSpyMessage[] pMsg,
ref Int32 pNumberOfMessages,
ref Int32 pNumberOfErrors
);
Атрибут [out] указывает маршаллеру p / invoke упорядочить собственную память обратно в управляемый массив структур. Маршаллер будет маршалировать элементы в соответствии с длиной управляемого массива.
Так что вам нужно выделить этот массив перед вызовом функции. API, который вы вызываете, требует, чтобы вы предоставили массив по крайней мере из 20 000 элементов.
icsSpyMessage[] pMsg = new icsSpyMessage[20000];
Int32 result = icsneoGetMessages(hObject, pMsg,
ref pNumberOfMessages, ref pNumberOfErrors);