从本机c ++到C#的回调byte []

时间:2014-08-29 16:18:09

标签: c# c++ pinvoke native-code

我有一个c ++本机dll(NOT CLR),它有回调c#应用程序。 除以下内容外,所有回调都有效:

C ++:

typedef int (__stdcall *TransmitBinaryMessageCallback)(GUID connectionID, byte data[], int data_size);

致电:

GUID ClientID = { 0x12345678, 0xabcd, 0xef12, { 0xfe, 0xdc, 0xa9, 0x87, 0x65, 0x43, 0x21, 0x11 } };
byte arrayB[10] = {0x2,0x4,0x6,0x8,0xaa,0xbb,0xcc,0xdd,0xee,0xff};
transmitBINMessage(ClientID,arrayB,10);

C#

[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate int TransmitBinaryMessageCallback(Guid ClientID,byte [] data,int data_size

public static int FuncTransmitBinaryMessageCallback(Guid ClientID, byte[] data, int data_size)
{
    try
    {
        System.Windows.Forms.MessageBox.Show("transmitBinaryMessageCallback: clientID=" + ClientID.ToString() + Environment.NewLine +
            "data=" + data.ToString() + Environment.NewLine +
            "data_size=" + data_size.ToString());
    }
    catch
    {
        return -1;
    }
    return 1;
}

我只得到第一个字节=> 0X2

我也试过了:

char[] arrayBytes = new char[data_size];
BinaryReader reader = new BinaryReader(new MemoryStream(data));
int i = reader.Read(arrayBytes, 0, data_size);

i = 0 :(

我缺少什么?

  

我可以将c ++从byte []更改为char *,将C#更改为string - >   这项工作。但我想要字节数组,为什么它不起作用?!

2 个答案:

答案 0 :(得分:3)

marshaller不知道字节数组有多长。它没有办法整理它。我将data声明为IntPtr,然后使用Marshal.Copy从非托管内存复制到字节数组。

[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate int TransmitBinaryMessageCallback(Guid ClientID, IntPtr dataPtr, int data_size);

然后在回调实现中

byte[] data = new byte[data_size];
Marshal.Copy(dataPtr, data, 0, data_size);

答案 1 :(得分:1)

我并不完全了解微软在C ++上的扩展程度,但我不相信C ++目前有byte类型。我创建了新的MFC DLL项目来看看。他们的byte类型只不过是typedef unsigned char byte;

尝试将签名更改为

typedef int (__stdcall *TransmitBinaryMessageCallback)(GUID connectionID, byte* data, int data_size);