我有两个函数,我试图从C#调用它们共享相似的签名:
BOOL Read (BYTE Len, BYTE* DataBuf)
BOOL Write (BYTE Len, BYTE* DataBuf)
来自Doc:DataBuf传输数据的目的地
我应该在C#中使用什么?
还没有要测试的硬件,但我正试图在我们拥有的时候接听尽可能多的电话。
感谢。
答案 0 :(得分:2)
对于您使用的读取功能:
[Out] byte[] buffer
对于您使用的写入功能:
[In] byte[] buffer
[In]
是默认值,可以省略,但明确不会有害。
因此,函数将是:
[DllImport(filename, CallingConvention = CallingConvention.Cdecl)]
static extern bool Read(byte len, [Out] byte[] buffer);
[DllImport(filename, CallingConvention = CallingConvention.Cdecl)]
static extern bool Write(byte len, [In] byte[] buffer);
显然,在将数组传递给非托管函数之前,您需要先分配数组。
因为byte
是blittable,所以作为优化的编组器会固定数组并传递固定对象的地址。这意味着不执行复制并且参数传递是有效的。
答案 1 :(得分:0)
它可能是从IntPtr
数组获得的byte[]
。较早的问题肯定应该包括:How to get IntPtr from byte[] in C#