将C# Byte[]传递到C++ API

w3nuxt5m  于 7个月前  发布在  C#
关注(0)|答案(1)|浏览(102)

我必须传递一个包含MAC地址的字节数组给C方法。由于我没有太多使用C C API的经验,我不知道如何做到这一点。我试图传递数组本身,但从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];


当然,数组不是空的。

mrphzbgm

mrphzbgm1#

举例来说,您可以:
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, (uint)data.Length);


如果你有一个固定长度的数组,例如:
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);

相关问题