如何在 C# 中从 C.dll 编组字节 *
How to marshall byte* from C.dll in C#
我尝试从 C# 调用两个具有相似签名的函数:
BOOL Read (BYTE Len, BYTE* DataBuf)
BOOL Write (BYTE Len, BYTE* DataBuf)
来自文档:DataBuf Destination of transmitted data
C#调用应该用什么?
- 字节[]
- myByteArr[0]
- P/Invoke 助理建议System.IntPtr
还没有要测试的硬件,但我正在努力争取尽可能多的电话。
谢谢。
它可能是从 byte[]
数组中获得的 IntPtr
。较早的问题肯定应该涵盖:How to get IntPtr from byte[] in C#
对于您使用的读取功能:
[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 然后编组器作为优化,固定数组并传递固定对象的地址。这意味着不执行复制并且参数传递是高效的。
我尝试从 C# 调用两个具有相似签名的函数:
BOOL Read (BYTE Len, BYTE* DataBuf)
BOOL Write (BYTE Len, BYTE* DataBuf)
来自文档:DataBuf Destination of transmitted data
C#调用应该用什么?
- 字节[]
- myByteArr[0]
- P/Invoke 助理建议System.IntPtr
还没有要测试的硬件,但我正在努力争取尽可能多的电话。
谢谢。
它可能是从 byte[]
数组中获得的 IntPtr
。较早的问题肯定应该涵盖:How to get IntPtr from byte[] in C#
对于您使用的读取功能:
[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 然后编组器作为优化,固定数组并传递固定对象的地址。这意味着不执行复制并且参数传递是高效的。