错误在于您使用
out
关键字。如果您需要被调用方分配一个新数组并将其返回给您,则可以使用该方法。这是一个额外的间接层次。
因此,您可以使用以下p/invoke:
[DllImport("RS232LIB.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int Read(byte[] bytesRead, uint maxNbBytes, uint timeOutMs);
这样称呼它:
var bytes = new byte[4];
Read(bytes, (uint)bytes.Length, timeOutMs);
请注意
byte
是可飞行的,等等
byte[]
是可飞行的。这意味着该框架将简单地固定您的阵列。因此,它编组为
[In,Out
]。如果你想更明确地表达你的意图,你可以写:
[DllImport("RS232LIB.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int Read([Out] byte[] bytesRead, uint maxNbBytes, uint timeOutMs);
但这种行为不会有任何不同。数组仍将被固定,从语义上讲,参数将为
[In,Out]
。
我也去掉了不必要的
CharSet
并将其他两个参数更改为
uint
匹配
unsigned int
。当然,使用
无符号整型
可能会引入额外的演员阵容,您可能会感到厌烦。你可能会因为坚持而被原谅
int
为了方便起见,在p/invoke声明中。