如何在C#中从C.dll编组字节*

时间:2015-07-11 04:08:14

标签: c# c pinvoke marshalling

我有两个函数,我试图从C#调用它们共享相似的签名:

BOOL Read (BYTE Len, BYTE* DataBuf)
BOOL Write (BYTE Len, BYTE* DataBuf)

来自Doc:DataBuf传输数据的目的地

我应该在C#中使用什么?

  • 字节[]
  • myByteArr [0]
  • P / Invoke Assistant建议使用System.IntPtr

还没有要测试的硬件,但我正试图在我们拥有的时候接听尽可能多的电话。

感谢。

2 个答案:

答案 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#