将C#字节[]传递给C API

Pass C# Byte[] to C++ API

本文关键字:API 字节      更新时间:2023-10-16

我必须将包含MAC地址的字节数组传递到C 方法。由于我没有太多与C合作的经验C Apisi不知道该怎么做。我尝试通过数组本身,但是从API 中获得了invalid parameter code 。我还尝试创建IntPtr,但无济于事。
我知道问题是C 无法处理托管数据类型,例如数组,因此我认为我可以以某种方式创建一个非托管的数组。

这是C 方法的定义:

ll_status_t LL_Connect(
ll_intf_t intf, 
uint8_t address[6]);

C#中的数组按以下方式定义:

Byte[] addr = new Byte[6];

当然,数组不是空的。

例如:

C

extern "C"
{
    __declspec(dllexport) void GetData(uint8_t* data, uint32_t length)
    {
      for (size_t i = 0; i < length; ++i)
        data[i] = i;
    }
}

c#

[DllImport("LibName.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern void GetData([In, Out] [MarshalAs(UnmanagedType.LPArray)] byte[] data, uint length);

并在C#

中使用
 byte[] data = new byte[4];
 GetData(data, (unit)data.Lenght);

如果您的数组固定长度,例如:

C

extern "C"
{
    __declspec(dllexport) void GetData(uint8_t data[6])
    {
      for (size_t i = 0; i < 6; ++i)
        data[i] = i;
    }
}

c#

[DllImport("LibName.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern void GetData([In, Out] [MarshalAs(UnmanagedType.LPArray, SizeConst = 6)] byte[] data);

并在C#

中使用
 byte[] data = new byte[6];
 GetData(data);

对于您的情况:

    [DllImport("LibName.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
    public static extern int LL_Connect(byte intf, [In, Out] [MarshalAs(UnmanagedType.LPArray, SizeConst = 6)] byte[] address);