我有一个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 - > 这项工作。但我想要字节数组,为什么它不起作用?!
答案 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);